从前序与中序遍历序列构造二叉树
题目
分析:
一般我们是通过递归,由已知的二叉树获取遍历的序列,这题的要求和以往相反,需要我们通过前序和中序遍历的序列构造出二叉树。基本思路是递归来实现建树,关键是找到不同当前root节点与下一层节点的关系,如何得到两个子树的前序和中序遍历然后递归这个方法,其中还要实现root节点与其左子节点和右子节点的连接。第一次调用该方法new一个根节点,调用左右子树的该方法分别返回一个左子节点和右子节点的实例,然后建立联系。
要点归纳:
递归算法在二叉树中的应用核心是找到当前节点的返回结果与子节点的关系,通过获取以子节点为参数的返回值来实现当前的操作目标。总之,找联系!
Arrays.copyOfRange:
这是一个常用的复制数组的方法,可以指定原数组的两个下标分别作为起点和终点,这个区间左闭右开。
此题:此题要做两件事情:1、找到四个数组,然后分别递归左右子树。2、把返回的两个节点和当前节点建立联系。
代码:
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length==0){
return null;
}
TreeNode root=new TreeNode(preorder[0]);
int rootNum=0;
for(int i=0;i<inorder.length;i++){
if(inorder[i]==preorder[0]){
rootNum=i;
break;
}
}
int num1=rootNum;
int num2=inorder.length-rootNum-1;
int[] leftPre=Arrays.copyOfRange(preorder,1, num1+1);
int[] rightPre=Arrays.copyOfRange(preorder, num1+1, num1+num2+1);
int[] leftIno=Arrays.copyOfRange(inorder, 0, num1);
int[] rightIno=Arrays.copyOfRange(inorder, num1+1,num1+num2+1);
root.left=buildTree(leftPre, leftIno);
root.right=buildTree(rightPre, rightIno);
return root;
}
}
从中序与后序遍历序列构造二叉树
题目:
分析:思路和前者相同,唯一区别的前序遍历变成了后序遍历,3放在了后面。根据根节点再中序遍历中的位置,得到左右子树的节点个数,然后获取四个数组,递归两个子树,最后根据返回的节点建立引用关系。
代码:
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(postorder.length==0){
return null;
}
TreeNode root=new TreeNode(postorder[postorder.length-1]);
int rootNum=0;
for(int i=0;i<inorder.length;i++){
if(inorder[i]==postorder[postorder.length-1]){
rootNum=i;
break;
}
}
int num1=rootNum;
int num2=inorder.length-rootNum-1;
int[] leftPos=Arrays.copyOfRange(postorder,0, num1);
int[] rightPos=Arrays.copyOfRange(postorder, num1, num1+num2);
int[] leftIno=Arrays.copyOfRange(inorder, 0, num1);
int[] rightIno=Arrays.copyOfRange(inorder, num1+1,num1+num2+1);
root.left=buildTree(leftIno,leftPos);
root.right=buildTree( rightIno,rightPos);
return root;
}
}