递归 开心 二叉树 前序遍历 中序遍历 构造树
- 从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出:
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树
3
/ \
9 20
/ \
15 7
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] a, int[] b) {
if(a.length==0||b.length==0){
return null;
}
return comodTree(a,b,0,a.length-1,0,b.length-1);
}
TreeNode comodTree(int a[],int b[],int abegin,int aend,int bbegin,int bend){ //递归分解
TreeNode treeNode=new TreeNode(a[abegin]); //保留头节点
int recordRoot=-1;
for(int i=bbegin;i<=bend;i++){ //在中序遍历中查看头节点
if(a[abegin]==b[i]){
recordRoot=i;
}
}
int leftLength=recordRoot-bbegin; //左子树的度
int rightLength=bend-recordRoot; //右子树的度
//System.out.println(leftLength +" "+rightLength);
if(leftLength<=0){ //如果左子树的度小于1的话
treeNode.left=null;
}else if(leftLength==1){ //如du果左子树的度大于1的话
treeNode.left=new TreeNode(b[recordRoot-1]);
}else{
TreeNode treeNodeLeft=comodTree(a,b,abegin+1,abegin+leftLength,bbegin,recordRoot-1); //递归查找
treeNode.left=treeNodeLeft; //将左子树赋值给根节点的left
}
if(rightLength<=0){ //右子树同理
treeNode.right=null;
}else if(rightLength==1){
treeNode.right=new TreeNode(b[recordRoot+1]);
}else{
TreeNode treeNodeRight=comodTree(a,b,abegin+leftLength+1,aend,recordRoot+1,bend);
treeNode.right=treeNodeRight;
}
return treeNode; //返回根节点
}
}