7、重建二叉树

1、 题目描述:

  输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
 
2、思路:前序遍历--根左右 ,中序遍历--左根右
  拿到题目之后,很容易按照自己的思维先把题目中给的例子进行重建,一点点的重建就会让自己陷入到无数的细节中,从而丧失全局思维。这道题不可能用普通的方式一点点的重建的,因为每个二叉树的深度都有可能不同,可能无限大,也可能很小。所以一定要用递归的思维去解决,用递归,就要把思维从无数的细节中抽离出来,从宏观去看待问题。
  我们根据前序遍历和中序遍历的结果,就可以锁定根的位置、左子树的范围、右子树的范围。这就够了,因为左右子树也要符合遍历规则。只需要用相同的方法继续对左右子树进行重建即可。
  总之,这道题就是在用代码找 根、左子树、右子树的位置。
 
3、代码
import java.util.*;
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
       if(pre.length == 0||in.length == 0){
            return null;
        }
        TreeNode node = new TreeNode(pre[0]);
        //扫描中序遍历结果,确定左右子树的位置
        for(int i = 0; i < in.length; i++){
            if(pre[0] == in[i]){
                node.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i+1), Arrays.copyOfRange(in, 0, i));
                node.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i+1, pre.length), Arrays.copyOfRange(in, i+1,in.length));
            }
        }
        return node;
    }
}

猜你喜欢

转载自www.cnblogs.com/guoyu1/p/12058100.html
今日推荐