首先给定两个数组pre[] 和 in[],里面分别存着给定二叉树的前序遍历和中序遍历,下面我们来分析:
- 根据前序遍历的特点,前序遍历的第一个节点便是二叉树的头结点head;
- 头结点后紧接着的元素便是头结点的左子树,即head.left;
- 根据中序遍历的特点,头结点后紧接的元素便是头结点的右子树,即head.right;
- 根据这个特点,我们便通过递归来完成这个过程
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public static TreeNode buildTree(int[] preorder, int[] inorder) {
TreeNode head = test(preorder,inorder,0,preorder.length-1,0,inorder.length-1);
return head;
}
public static TreeNode test(int[] pre, int[] in,int pl,int pr,int il,int ir){
System.out.println(pl+" "+pr+" "+il+" "+ir);
if(pl > pr){ //递归退出条件
return null;
}else if( pl == pr){
return new TreeNode(pre[pl]);
}
int index = pl;
TreeNode head = new TreeNode(pre[pl]);//头结点后紧接的元素便是head的左?右 子树
for(int i = index ; i <= ir; i++){
if(pre[pl] == in[i]){ //寻找头节点
head.left = test(pre,in, pl+1 ,pl+i-il , il , i-1);
head.right = test(pre, in ,pl+i-il+1 , pr, i+1, ir);
break;
}
}
return head;
}