根据前序和中序遍历重建二叉树 java

超、凢脫俗 2022-05-09 09:30 284阅读 0赞

根据前序和中序遍历重建二叉树 java

题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

先来分析一下前序遍历和中序遍历得到的结果,
前序遍历第一位是根节点;
中序遍历中,根节点左边的是根节点的左子树,右边是根节点的右子树。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}。

首先,根节点 是{ 1 };
左子树是:前序{ 2,4,7 } ,中序{ 4,7,2 };
右子树是:前序{ 3,5,6,8 } ,中序{ 5,3,8,6 };
这时,如果我们把左子树和右子树分别作为新的二叉树,则可以求出其根节点,左子树和右子树。
这样,一直用这个方式,就可以实现重建二叉树。

代码1:

  1. public class Solution {
  2. public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
  3. TreeNode root = reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
  4. return root;
  5. }
  6. // 前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}
  7. private TreeNode reConstructBinaryTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {
  8. if (startPre > endPre || startIn > endIn) {
  9. return null;
  10. }
  11. TreeNode root = new TreeNode(pre[startPre]);
  12. for (int i = startIn; i <= endIn; i++)
  13. if (in[i] == pre[startPre]) {
  14. root.left = reConstructBinaryTree(pre, startPre + 1, startPre + i - startIn, in, startIn, i - 1);
  15. root.right = reConstructBinaryTree(pre, i - startIn + startPre + 1, endPre, in, i + 1, endIn);
  16. break;
  17. }
  18. return root;
  19. }
  20. }

代码2:

  1. public class Solution {
  2. // 主函数,用于测试结果
  3. public static void main(String[] args) {
  4. int[] pre = { 1, 2, 4, 7, 3, 5, 6, 8 };
  5. int[] in = { 4, 7, 2, 1, 5, 3, 8, 6 };
  6. TreeNode tree = reConstructBinaryTree(pre, in);
  7. System.out.print("先序遍历结果: ");
  8. preTraverseBinTree(tree);
  9. System.out.println();
  10. System.out.print("中序遍历结果: ");
  11. inTraverseBinTree(tree);
  12. System.out.println();
  13. System.out.print("后序遍历结果: ");
  14. postTraverseBinTree(tree);
  15. System.out.println();
  16. }
  17. // 主功能函数
  18. public static TreeNode reConstructBinaryTree(int[] pre, int[] in) {
  19. if (pre == null || in == null) {
  20. return null;
  21. }
  22. TreeNode tn = reConstructBinaryTreeCore(pre, in, 0, pre.length - 1, 0, in.length - 1);
  23. return tn;
  24. }
  25. // 核心递归
  26. public static TreeNode reConstructBinaryTreeCore(int[] pre, int[] in, int preStart, int preEnd, int inStart,
  27. int inEnd) {
  28. TreeNode tree = new TreeNode(pre[preStart]);
  29. tree.left = null;
  30. tree.right = null;
  31. if (preStart == preEnd && inStart == inEnd) {
  32. return tree;
  33. }
  34. int root = 0;
  35. for (root = inStart; root < inEnd; root++) {
  36. if (pre[preStart] == in[root]) {
  37. break;
  38. }
  39. }
  40. int leifLength = root - inStart;
  41. int rightLength = inEnd - root;
  42. if (leifLength > 0) {
  43. tree.left = reConstructBinaryTreeCore(pre, in, preStart + 1, preStart + leifLength, inStart, root - 1);
  44. }
  45. if (rightLength > 0) {
  46. tree.right = reConstructBinaryTreeCore(pre, in, preStart + 1 + leifLength, preEnd, root + 1, inEnd);
  47. }
  48. return tree;
  49. }
  50. // 将二叉树先序遍历,用于测试结果
  51. public static void preTraverseBinTree(TreeNode node) {
  52. if (node == null) {
  53. return;
  54. }
  55. System.out.print(node.val + " ");
  56. if (node.left != null) {
  57. preTraverseBinTree(node.left);
  58. }
  59. if (node.right != null) {
  60. preTraverseBinTree(node.right);
  61. }
  62. }
  63. // 将二叉树中序遍历,用于测试结果
  64. public static void inTraverseBinTree(TreeNode node) {
  65. if (node == null) {
  66. return;
  67. }
  68. if (node.left != null) {
  69. inTraverseBinTree(node.left);
  70. }
  71. System.out.print(node.val + " ");
  72. if (node.right != null) {
  73. inTraverseBinTree(node.right);
  74. }
  75. }
  76. // 将二叉树后序遍历,用于测试结果
  77. public static void postTraverseBinTree(TreeNode node) {
  78. if (node == null) {
  79. return;
  80. }
  81. if (node.left != null) {
  82. postTraverseBinTree(node.left);
  83. }
  84. if (node.right != null) {
  85. postTraverseBinTree(node.right);
  86. }
  87. System.out.print(node.val + " ");
  88. }
  89. }

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读