给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
代码实现:
import java.io.*;
import java.util.TreeMap;
public class Main {
static String[] lrd, ldr;
static TreeMap<Integer, String> map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());// 节点个数
lrd = br.readLine().split(" ");// 后序遍历
ldr = br.readLine().split(" ");// 中序遍历
map = new TreeMap<>();
dlr(0, n - 1, 1, n - 1);
String s = "";
for (String value : map.values()) {
s += value + " ";
}
out.print(s.trim());
out.flush();
}
private static void dlr(int start, int end, int key, int root) {
// 起,止,键,根
if (start > end)
return;
int i = start;
while (i < end && !lrd[root].equals(ldr[i]))
i++;
map.put(key, lrd[root]);// 根
dlr(start, i - 1, key * 2, root - end + i - 1);// 左
dlr(i + 1, end, key * 2 + 1, root - 1);// 右
}
}