解法一:中序遍历+后续遍历+BFS

根据后序遍历找出根结点,结合中序遍历划分左右子树,推理出整棵树的结构。再进行BFS。

  1. import java.io.*;
  2. import java.util.*;
  3. public class Main {
  4. // 后序遍历
  5. private static int[] postOrder;
  6. // 中序遍历
  7. private static int[] inOrder;
  8. public static void main(String[] args) throws IOException {
  9. StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  10. PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  11. in.nextToken();
  12. int N = (int) in.nval;
  13. postOrder = new int[N];
  14. for (int i = 0; i < N; ++i) {
  15. in.nextToken();
  16. postOrder[i] = (int) in.nval;
  17. }
  18. inOrder = new int[N];
  19. for (int i = 0; i < N; ++i) {
  20. in.nextToken();
  21. inOrder[i] = (int) in.nval;
  22. }
  23. TreeNode root = build(0, N - 1, 0, N - 1);
  24. levelOrder(N, root, out);
  25. }
  26. private static TreeNode build(int postL, int postR, int inL, int inR) {
  27. if (postL > postR || inL > inR) {
  28. return null;
  29. }
  30. int val = postOrder[postR];
  31. TreeNode root = new TreeNode(val);
  32. int index = inL;
  33. for (; (inOrder[index] != val) && (index <= inR); ++index) ;
  34. int leftLen = index - inL;
  35. root.left = build(postL, postL + leftLen - 1, inL, index - 1);
  36. root.right = build(postL + leftLen, postR - 1, index + 1, inR);
  37. return root;
  38. }
  39. private static void levelOrder(int N, TreeNode root, PrintWriter out) {
  40. Queue<TreeNode> queue = new LinkedList<>();
  41. queue.offer(root);
  42. while (!queue.isEmpty()) {
  43. int size = queue.size();
  44. for (int i = 0; i < size; ++i) {
  45. TreeNode tmp = queue.poll();
  46. if (tmp==root) {
  47. out.print(tmp.val);
  48. }else {
  49. out.print(" " + tmp.val);
  50. }
  51. if (tmp.left != null) {
  52. queue.offer(tmp.left);
  53. }
  54. if (tmp.right != null) {
  55. queue.offer(tmp.right);
  56. }
  57. }
  58. }
  59. out.println();
  60. out.flush();
  61. }
  62. }
  63. class TreeNode {
  64. TreeNode left;
  65. TreeNode right;
  66. int val;
  67. public TreeNode(int val) {
  68. left = null;
  69. right = null;
  70. this.val = val;
  71. }
  72. }