输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
实例:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
class Solution {
HashMap <Integer,Integer>hm=new HashMap();
int []preorder;
public TreeNode buildTree(int[] preorder, int[] inorder) {
for(int i=0;i<preorder.length;i++)
{
hm.put(inorder[i],i);
}
this.preorder=preorder;
return rec(0,0,preorder.length-1);
}
public TreeNode rec(int root,int left,int right)
{
if(left>right) return null;
int i=hm.get(preorder[root]);
TreeNode node=new TreeNode(preorder[root]);
node.left=rec(root+1,left,i-1);
node.right=rec(root+i-left+1,i+1,right);
return node;
}
}
心得:preorder数组判断根节点,inorder数据判断左右字数的范围。
这个代码第一次写错了node.right=rec(root+i-left+1,i+1,right);
写成了node.right=rec(i-left+1,i+1,right);