直接上解决思路:
后序遍历的最后一个值就是根节点的值,然后在中序遍历中找到根节点的值,位于根节点之前的就是左子树,之后的就是右子树。递归解决问题
代码:
public static void preTraversing(TreeNode head){
if (head==null){
return;
}
System.out.print(head.val+" ");
preTraversing(head.left);
preTraversing(head.right);
}
public static TreeNode rebulid_BinaryTree(int[] a,int midstart,int midEnd,int[] b,int afterStart,int afterEnd,int length){
if (a.length==0||b.length==0||length<=0){
return null;
}
int value=b[afterEnd];
TreeNode root=new TreeNode(value);
if (length==1){
return root;
}
int i=0;
while(i<length){
if (value==a[midEnd-i]){
break;
}
i++;
}
root.left=rebulid_BinaryTree(a,midstart,midEnd-i-1,b,afterStart,afterEnd-i-1,length-1-i);
root.right=rebulid_BinaryTree(a,midstart+i,midEnd,b,afterStart+i-1,afterEnd-1,i);
return root;
}
构造二叉树:
class TreeNode {
public int val;
public TreeNode left, right;
public TreeNode(int val) {
this.val = val;
this.left = this.right = null;
}
}
我的测试主类:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入你的节点数:");
int n=sc.nextInt();
int[] a=new int[n];
int[] b=new int[n];
System.out.println("请输入你的中序序列:");
for (int i = 0; i < n; i++) {
a[i]=sc.nextInt();
}
System.out.println("请输入你的后序序列:");
for (int i = 0; i <n ; i++) {
b[i]=sc.nextInt();
}
TreeNode head=rebulid_BinaryTree(a,0,a.length-1,b,0,b.length-1,b.length);
System.out.println("你的二叉树前序遍历为:");
preTraversing(head);
}