1. import java.util.ArrayList;
    2. import java.util.Arrays;
    3. /**
    4. * 面试题7:重建二叉树
    5. * 输入某二叉树的前序遍历和中序遍历的结果,重建该二叉树。假设输入的前序遍历和中序遍历的结果都不含重复的数字
    6. * 例如,输入前序遍历{1,2,4,7,3,5,6,8}和中序遍历{4,7,2,1,5,3,8,6}
    7. * 重建并输出头节点
    8. */
    9. public class No7 {
    10. //递归(传入数组拷贝)
    11. public static BinaryTree reConstructBinaryTree(int[] pre, int[] in) {
    12. //首先考虑测试用例
    13. //(1)普通二叉树(完全二叉树,不完全二叉树)
    14. //(2)特殊二叉树(所有节点都没有左(右)节点的二叉树,只有一个节点的二叉树)
    15. //(3)特殊输入用例(前序遍历和中序遍历不匹配,根节点为null)
    16. if (pre == null || in == null || in.length == 0 || in.length != pre.length) {
    17. return null;
    18. }
    19. BinaryTree root = new BinaryTree(pre[0]);
    20. for (int i = 0; i < pre.length; i++) {
    21. if (pre[0] == in[i]) {
    22. root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(in, 0, i));
    23. root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
    24. }
    25. }
    26. return root;
    27. }
    28. public static void main(String[] args) {
    29. int[] pre = {1,2,4,7,3,5,6,8};
    30. int[] in = {4,7,2,1,5,3,8,6};
    31. BinaryTree.printPostTree(reConstructBinaryTree(pre,in));
    32. }
    33. }
    34. class BinaryTree {
    35. public BinaryTree left;
    36. public BinaryTree right;
    37. public int value;
    38. public BinaryTree(int value) {
    39. this(null, null, value);
    40. }
    41. public BinaryTree(BinaryTree left, BinaryTree right, int value) {
    42. this.left = left;
    43. this.right = right;
    44. this.value = value;
    45. }
    46. public void insertLeft(BinaryTree currentNode, int value) {
    47. if (currentNode == null) {
    48. return;
    49. }
    50. BinaryTree newLeftNode = new BinaryTree(value);
    51. if (currentNode.left != null) {
    52. newLeftNode.left = currentNode.left;
    53. }
    54. currentNode.left = newLeftNode;
    55. }
    56. public void insertRight(BinaryTree currentNode, int value) {
    57. if (currentNode == null) {
    58. return;
    59. }
    60. BinaryTree newRightNode = new BinaryTree(value);
    61. if (currentNode.right != null) {
    62. newRightNode.right = currentNode.right;
    63. }
    64. currentNode.right = newRightNode;
    65. }
    66. //前序遍历二叉树
    67. public static void printPreTree(BinaryTree currentNode) {
    68. if (currentNode == null) {
    69. return;
    70. }
    71. System.out.print(currentNode.value);
    72. System.out.print("--");
    73. if (currentNode.left != null) {
    74. printPreTree(currentNode.left);
    75. }
    76. if (currentNode.right != null) {
    77. printPreTree(currentNode.right);
    78. }
    79. }
    80. //中序遍历二叉树
    81. public static void printInTree(BinaryTree currentNode) {
    82. if (currentNode == null) {
    83. return;
    84. }
    85. if (currentNode.left != null) {
    86. printInTree(currentNode.left);
    87. }
    88. System.out.print(currentNode.value);
    89. System.out.print("--");
    90. if (currentNode.right != null) {
    91. printInTree(currentNode.right);
    92. }
    93. }
    94. //后序遍历二叉树
    95. public static void printPostTree(BinaryTree currentNode){
    96. if(currentNode == null){
    97. return;
    98. }
    99. if(currentNode.left != null){
    100. printPostTree(currentNode.left);
    101. }
    102. if (currentNode.right != null){
    103. printPostTree(currentNode.right);
    104. }
    105. System.out.print(currentNode.value);
    106. System.out.print("--");
    107. }
    108. }

    扩展:如果给出的是中序遍历和后序遍历呢(和上述过程差不多)
    前序遍历+后序遍历:不能确定二叉树,所以不能重建