重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
限制:
0 <= 节点个数 <= 5000
思路
根据前序遍历来判断根结点的位置,再根据根结点来在中序序列中判断左子树和右子树的大小
解答
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// 中序序列索引
private Map<Integer, Integer> map = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
for (int i = 0; i < inorder.length; i++)
map.put(inorder[i], i);
return reBuild(preorder, 0, preorder.length - 1, 0);
}
private TreeNode reBuild(int[] pre, int left, int right, int inOrderLeft) {
if (right < left) return null;
TreeNode node = new TreeNode(pre[left]);
// 求中序节点索引
int inIndex = map.get(node.val);
// 左子树大小
int leftTreeSize = inIndex - inOrderLeft;
node.left = reBuild(pre, left + 1, left + leftTreeSize, inOrderLeft);
node.right = reBuild(pre, left + leftTreeSize + 1, right, inOrderLeft + leftTreeSize + 1);
return node;
}
}