给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
NOTE:
不需要构建二叉树,与后序中序转为前序代码类似,不过需要加一个index变量,表示当前根节点在二叉树中所对应的下标,从0开始,0表示整个二叉树根节点对应的下标。
根据后序和中序找到树的根节点,之后进行前序遍历,根左右,依次遍历左右子树,左子树index 变为2*index + 1;右子树变为2*index+2。每次找到子数的根节点就存入TreeMap<Integer,Integer> level中。TreeMap的键对应index,值对应根节点,TreeMap是有序的,按照键index大小排序,输出正好是该树的层序遍历的序列。
代码:
import java.util.*;
public class Main {
private static Vector<Integer> post = new Vector<>();//存储后序遍历结点
private static Vector<Integer> in = new Vector<>();//存储中序遍历结点
private static TreeMap<Integer,Integer> level = new TreeMap<>();//有序/LinkedHashMap
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 0; i<n; i++)post.add(sc.nextInt());
for(int i = 0; i<n; i++)in.add(sc.nextInt());
pre(n-1,0,n-1,0);
Set set = level.entrySet();//存储层序遍历结点
Iterator it = set.iterator();//开始输出层序遍历结点
Map.Entry entry = (Map.Entry)it.next();
System.out.print((Integer)entry.getValue());
while(it.hasNext()){
entry = (Map.Entry)it.next();
System.out.print(" "+(Integer)entry.getValue());
}
}
private static void pre(int root, int start, int end, int index) {
if(start > end)return;
int i = start;
while(i < end && in.get(i) != post.get(root))i++;
level.put(index,post.get(root));//根
pre(root - 1 - end + i, start, i - 1, 2 * index + 1);//左
pre(root - 1, i + 1, end, 2 * index + 2);//右
}
}