输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 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; } }