剑指Offer 07.重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

 3

9  20
     /   
   15    7

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length == 0) return null;
        TreeNode res = new TreeNode(preorder[0]);
        int idx = -1;
        for(int i = 0; i < preorder.length; i++){
            if(inorder[i] == preorder[0]){
                idx = i;break; // 找到前序的根,在中序中的位置,因为通过中序的位置下标,可以得出:根左边有几个节点,根的右边有几个节点。这是不容易想通的,想通了这一点,就好办了。
因为可以确定出前序遍历中,属于根节点左边的数组,同理,右边也是。同理,中序中,也能切割出两块
} } res.left = this.buildTree(Arrays.copyOfRange(preorder,1,1+idx), Arrays.copyOfRange(inorder,0,idx)); res.right = this.buildTree(Arrays.copyOfRange(preorder,1+idx, preorder.length), Arrays.copyOfRange(inorder,idx+1,inorder.length)); return res; } }
原文地址:https://www.cnblogs.com/luo-c/p/13648770.html