解法一:中序遍历+后续遍历+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;}}
