根据前序遍历和中序遍历来重建二叉树,并用后序遍历的方法打印出二叉树的序列
先给出二叉树的前序遍历:
{1,2,4,7,3,5,6,8}
再给出二叉树的中序遍历:
{4,7,2,1,5,3,8,6}
解决思路:
前序遍历中的第一个值就是二叉树的根节点,然后在中序遍历中找到根节点的位置,根节点之前的就是它的左子树,根节点之后就是它的右子树,然后根据它的左子树和右子树的长度,在前序遍历中确定它们的位置,然后递归的解决问题。
话不多说,直接上代码
public static void afterTraversing(TreeNode head){
if (head==null){
return;
}
afterTraversing(head.left);
afterTraversing(head.right);
System.out.print(head.val+" ");
}
// []a:前序遍历数组 []b:中序遍历数组 start:子树的起始地址 end:中序遍历结束位置 length:节点数
public static TreeNode rebulid_BinaryTree(int[] a,int start,int[] b,int end,int length){
// 参数验证
if (a.length==0||b.length==0||length<=0){
return null;
}
// 根据前序遍历的第一个元素建立树根节点
int value=a[start];
TreeNode root=new TreeNode(value);
//递归终止条件:子树只有一个节点
if (length==1){
return root;
}
// 根据前序遍历的第一个元素在中序遍历的位置分拆树的左子树和右子树
int i=0;
while(i<length){
if (value==b[end-i]){
break;
}
i++;
}
// 递归的创建左子树和右子树
root.left=rebulid_BinaryTree(a,start+1,b,end-i-1,length-1-i);
root.right=rebulid_BinaryTree(a,start+length-i,b,end,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,b,b.length-1,b.length);
System.out.println("你的后序序列为:");
afterTraversing(head);
}