输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。
注意:
- 二叉树中每个节点的值都互不相同;
- 输入的前序遍历和中序遍历一定合法;
样例
给定: 前序遍历是:[3, 9, 20, 15, 7] 中序遍历是:[9, 3, 15, 20, 7] 返回:[3, 9, 20, null, null, 15, 7, null, null, null, null] 返回的二叉树如下所示: 3 / \ 9 20 / \ 15 7
代码:
/**
* Definition for a binary tree node.
* class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private HashMap<Integer,Integer> pos=new HashMap();
public TreeNode buildTree(int[] preorder, int[] inorder) {
int sz=preorder.length;
for(int i=0;i<sz;i++){
int val = inorder[i];
pos.put(val,i);
}
return rbd(preorder,inorder,0,sz-1,0,sz-1);
}
private TreeNode rbd(int[]preorder,int[] inorder,int preL,int preR,int inorderL,int inorderR){
if(preL>preR)
return null;
int k=pos.get(preorder[preL])-preL;
TreeNode root = new TreeNode(preorder[preL]);
root.left=rbd(preorder,inorder,preL+1,preL+k,inorderL,inorderL+k-1);
root.right=rbd(preorder,inorder,preL+k+1,preR,inorderL+k+1,inorderR);
return root;
}
}