解法一:中序遍历+后续遍历+BFS
根据后序遍历找出根结点,结合中序遍历划分左右子树,推理出整棵树的结构。再进行BFS。
import java.io.*;
import java.util.*;
public class Main {
// 后序遍历
private static int[] postOrder;
// 中序遍历
private static int[] inOrder;
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
int N = (int) in.nval;
postOrder = new int[N];
for (int i = 0; i < N; ++i) {
in.nextToken();
postOrder[i] = (int) in.nval;
}
inOrder = new int[N];
for (int i = 0; i < N; ++i) {
in.nextToken();
inOrder[i] = (int) in.nval;
}
TreeNode root = build(0, N - 1, 0, N - 1);
levelOrder(N, root, out);
}
private static TreeNode build(int postL, int postR, int inL, int inR) {
if (postL > postR || inL > inR) {
return null;
}
int val = postOrder[postR];
TreeNode root = new TreeNode(val);
int index = inL;
for (; (inOrder[index] != val) && (index <= inR); ++index) ;
int leftLen = index - inL;
root.left = build(postL, postL + leftLen - 1, inL, index - 1);
root.right = build(postL + leftLen, postR - 1, index + 1, inR);
return root;
}
private static void levelOrder(int N, TreeNode root, PrintWriter out) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; ++i) {
TreeNode tmp = queue.poll();
if (tmp==root) {
out.print(tmp.val);
}else {
out.print(" " + tmp.val);
}
if (tmp.left != null) {
queue.offer(tmp.left);
}
if (tmp.right != null) {
queue.offer(tmp.right);
}
}
}
out.println();
out.flush();
}
}
class TreeNode {
TreeNode left;
TreeNode right;
int val;
public TreeNode(int val) {
left = null;
right = null;
this.val = val;
}
}