输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
递归
由于前序遍历的特性,相对的第一个结点即为当前树的根节点(可能为子树)
通过构造hashmap的映射 找到中序遍历对应的结点位置
即可得出当前根节点的左子树和右子树的大小
得到当前根节点的左子树大小后 即可得出前序遍历下左子树的结点区间
通过前序遍历左子树区间和中序遍历左子树区间递归求出根节点的左子树的根节点
右子树同理
class Solution {
Map<Integer, Integer> map;
public TreeNode buildTree(int[] preorder, int[] inorder) {
map = new HashMap<>();
for(int i = 0; i < inorder.length; i++){
map.put(inorder[i], i);
}
int n = inorder.length;
return traverse(preorder, inorder, 0, n - 1, 0, n - 1);
}
private TreeNode traverse(int[] preorder, int[] inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right){
if(preorder_left > preorder_right)
return null;
TreeNode root = new TreeNode(preorder[preorder_left]);
int inorder_rootIndex = map.get(preorder[preorder_left]);
int leftSize = inorder_rootIndex - inorder_left;
root.left = traverse(preorder, inorder, preorder_left + 1, preorder_left + leftSize, inorder_left, inorder_rootIndex - 1);
root.right = traverse(preorder, inorder, preorder_left + leftSize + 1, preorder_right, inorder_rootIndex + 1, inorder_right);
return root;
}
}