剑指offer系列——4.重建二叉树——前序中序确定树/中序后序确定树
Q:给出一棵树的前序遍历和中序遍历,请构造这颗二叉树
注意:
可以假设树中不存在重复的节点
A:
public TreeNode buildTree(int[] preorder, int[] inorder) {
int prelen=preorder.length;
int inlen=inorder.length;
return BT(preorder,0,prelen-1,inorder,0,inlen-1);
}
TreeNode BT(int[] preorder,int prestart,int preend,int[] inorder,int instart,int inend)
{
if(instart>inend)
return null;
TreeNode root=new TreeNode(preorder[prestart]);
int mid=0;
for(mid=instart;mid<=inend;mid++)
if(inorder[mid]==root.val)
break;
int leftlen=mid-instart;
root.left=BT(preorder,prestart+1,prestart+leftlen,inorder,instart,mid-1);
root.right=BT(preorder,prestart+leftlen+1,preend,inorder,mid+1,inend);
return root;
}
Q:给出一棵树的中序遍历和后序遍历,请构造这颗二叉树
注意:
保证给出的树中不存在重复的节点
A:
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(inorder==null||postorder==null||inorder.length==0||postorder.length==0||postorder.length!=inorder.length){
return null;
}
int in=inorder.length-1;
int post=postorder.length-1;
return solve(inorder,0,in,postorder,0,post);
}
//x,y分别代表中序遍历起始、结束位置,i,j分别代表后序遍历起始、结束位置
public TreeNode solve(int[] inorder,int x,int y,int[] postorder,int i,int j){
if(x>y||i>j){
return null;
}
TreeNode root=new TreeNode(postorder[j]);
for(int k=x;k<=y;k++){
if(inorder[k]==postorder[j]){
//k-x代表中序遍历中根节点的左子树长度
root.left=solve(inorder,x,k-1,postorder,i,i+k-x-1);
root.right=solve(inorder,k+1,y,postorder,i+k-x,j-1);
}
}
return root;
}