输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
限制:
0 <= 节点个数 <= 5000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:
int[] preorder1;
int[] inorder1;
//利用map 记录根节点在中序遍历中的位置
Map<Integer, Integer> map = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder1 = preorder;
this.inorder1 = inorder;
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i], i);
}
return dfs(0, preorder1.length - 1, 0, inorder1.length - 1);
}
private TreeNode dfs(int preL, int preR, int inL, int inR) {
if (preL > preR) return null;
TreeNode root = new TreeNode(preorder1[preL]);
//获取当前树根节点在中序遍历中的坐标a
Integer a = map.get(preorder1[preL]);
//构建左子树
root.left = dfs(preL + 1, preL + a - inL, inL, a - 1);
//构建右子树
root.right = dfs(preL + a - inL + 1, preR, a + 1, inR);
return root;
}