给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:7 2 3 1 5 7 6 4 1 2 3 4 5 6 7输出样例:
4 1 6 3 5 7 2
思路:1.采用递归思想构造二叉树
2.采用队列存储节点,层次遍历二叉树
java代码如下:
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class TreeNode {
int val;
TreeNode right;
TreeNode left;
TreeNode(int val){
this.val=val;
}
}
class Main {
public static TreeNode reConstructBinaryTree(int start1,int end1,int[] after,int start2,int end2,int[] in) {//构造二叉树
if(start1>end1) {
return null;
}else {
TreeNode treeNode=new TreeNode(after[end1]);
int i;
for(i=start2;i<=end2;i++) {
if(after[end1]==in[i]) {
break;
}
}
treeNode.left=reConstructBinaryTree(start1,start1+i-start2-1,after,start2,i-1,in);
treeNode.right=reConstructBinaryTree(end1-(end2-i),end1-1,after,i+1,end2,in);
return treeNode;
}
}
public static void printf(TreeNode treeNode) {//层次遍历
Queue<TreeNode> queue=new LinkedList<TreeNode>();
queue.offer(treeNode);
while(!queue.isEmpty()) {
TreeNode queueHead=queue.poll();
if(queueHead.left!=null) {
queue.offer(queueHead.left);
}
if(queueHead.right!=null) {
queue.offer(queueHead.right);
}
if(!queue.isEmpty()) {
System.out.print(queueHead.val+" ");
}else{
System.out.print(queueHead.val);
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int[] after=new int[n];
int[] in=new int[n];
for(int i=0;i<n;i++) {
after[i]=scanner.nextInt();
}
for(int i=0;i<n;i++) {
in[i]=scanner.nextInt();
}
scanner.close();
TreeNode treeNode=reConstructBinaryTree(0,after.length-1,after,0,in.length-1,in);
printf(treeNode);
}
}