剑指offer-重建二叉树

题目描述

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

思路:

​ 直接递归建树

​ 根据前序找到根节点,根据该根节点从中序前半为左子树的中序,后半为右子树的中序

​ 根据左子树的中序的数量确定前序中左子树的前序,剩余为右子树的前序

code

public TreeNode buildTree(int[] preorder, int[] inorder) {
    if(preorder.length==0) {
        return null;
    }
    TreeNode node=new TreeNode(preorder[0]);
    int len=inorder.length;
    int rootpos=0;
    int[] leftInArr;
    int[] leftPreArr;
    for(int i=0;i<len;++i) {
        if(inorder[i]==preorder[0]) {
            rootpos=i;
            break;
        }
    }
    leftInArr=Arrays.copyOfRange(inorder,0,rootpos);
    leftPreArr=Arrays.copyOfRange(preorder,1,leftInArr.length+1);
    node.left=buildTree(leftPreArr,leftInArr);

    int[] rightInArr=Arrays.copyOfRange(inorder,rootpos+1,len);
    int[] rightPreArr=Arrays.copyOfRange(preorder,leftInArr.length+1,len);
    node.right=buildTree(rightPreArr,rightInArr);
    return node;
}