输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树;
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
题目分析:
前序遍历特点:节点按照[根节点——左子树——右子树]排序 【3,9,20,15,7】
中序遍历:节点按照【左子树——根节点——右子数】【9,3,15,20,7】
输入前序和中序遍历结果都不含重复的数字,所以每个节点都是唯一的
class Solution {
//前序遍历的第一个节点就是根节点,用这个根节点区分中序遍历的左子树和右子树
HashMap<Integer, Integer> dic = new HashMap<>();
int[] po;
public TreeNode buildTree(int[] preorder, int[] inorder) {
po = preorder;
for(int i = 0; i < inorder.length; i++)
dic.put(inorder[i], i);
return recur(0, 0, inorder.length - 1);
}
TreeNode recur(int pre_root, int in_left, int in_right) {
if(in_left > in_right) return null;
TreeNode root = new TreeNode(po[pre_root]);
int i = dic.get(po[pre_root]);
root.left = recur(pre_root + 1, in_left, i - 1);
root.right = recur(pre_root + i - in_left + 1, i + 1, in_right);
return root;
}
}