[关闭]
@XQF 2018-03-07T23:00:43.000000Z 字数 6080 阅读 1327

如何已知先序和和中序,求后序?

数据结构与算法


1.已知中序和前序求后序

主要是依据中序求出offset,这个offset为了方便成了加上就能拿到索引那种

  1. public void createTreeWithPreAndIn(int[] preOrder, int[] inOrder) {
  2. root = createTreeWithPreAndIn(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);
  3. }
  4. public TreeNode createTreeWithPreAndIn(int[] preOrder, int preLeft, int preRight, int[] inOrder, int inLeft, int inRight) {
  5. if (preLeft > preRight || inLeft > inRight) {
  6. return null;
  7. }
  8. int rootData = preOrder[preLeft];
  9. TreeNode root = new TreeNode(rootData);
  10. int rootIndexInInOrder = findRootIndex(inOrder, inLeft, inRight, rootData);
  11. int offset = rootIndexInInOrder - 1 - inLeft;
  12. TreeNode left = createTreeWithPreAndIn(preOrder, preLeft + 1, preLeft + 1 + offset, inOrder, inLeft, inLeft + offset);
  13. TreeNode right = createTreeWithPreAndIn(preOrder, preLeft + 1 + offset + 1, preRight, inOrder, rootIndexInInOrder + 1, inRight);
  14. root.left = left;
  15. root.right = right;
  16. return root;
  17. }

2.已知中序和后序求前序

  1. public void createTreeWithInAndPost(int[] inOrder, int[] postOrder) {
  2. root = createTreeWithInAndPost(inOrder, 0, inOrder.length - 1, postOrder, 0, postOrder.length - 1);
  3. }
  4. public TreeNode createTreeWithInAndPost(int[] inOrder, int inLeft, int inRight, int[] postOrder, int postLeft, int postRight) {
  5. if (inLeft > inRight || postLeft > postRight) {
  6. return null;
  7. }
  8. int rootData = postOrder[postRight];
  9. TreeNode root = new TreeNode(rootData);
  10. int rootIndexInInOrder = findRootIndex(inOrder, inLeft, inRight, rootData);
  11. int offset = rootIndexInInOrder - 1 - inLeft;
  12. TreeNode left = createTreeWithInAndPost(inOrder, inLeft, inLeft + offset, postOrder, postLeft, postLeft + offset);
  13. TreeNode right = createTreeWithInAndPost(inOrder, rootIndexInInOrder + 1, inRight, postOrder, postLeft + offset + 1, postRight - 1);
  14. root.left = left;
  15. root.right = right;
  16. return root;
  17. }

3.找中序根索引方法

貌似不能根据前序和后序求出中序,因为,。,没办法确定左右子树的界限。

  1. public int findRootIndex(int[] inOrder, int leftIn, int rightIn, int target) {
  2. int result = -1;
  3. for (int i = leftIn; i <= rightIn; i++) {
  4. if (inOrder[i] == target) {
  5. result = i;
  6. break;
  7. }
  8. }
  9. return result;
  10. }

4.二叉树的所有基本操作

  1. class TreeNode {
  2. int data;
  3. TreeNode left;
  4. TreeNode right;
  5. public TreeNode(int data) {
  6. this.data = data;
  7. this.left = null;
  8. this.right = null;
  9. }
  10. }
  11. class BinaryTree {
  12. TreeNode root;
  13. public BinaryTree() {
  14. root = null;
  15. }
  16. public void insert(int data) {
  17. TreeNode node = new TreeNode(data);
  18. if (root == null) {
  19. root = node;
  20. } else {
  21. TreeNode dummy = root;
  22. while (true) {
  23. if (node.data < dummy.data) {
  24. if (dummy.left == null) {
  25. dummy.left = node;
  26. return;
  27. }
  28. dummy = dummy.left;
  29. } else {
  30. if (dummy.right == null) {
  31. dummy.right = node;
  32. return;
  33. }
  34. dummy = dummy.right;
  35. }
  36. }
  37. }
  38. }
  39. public TreeNode create(int[] datas) {
  40. for (int i = 0; i < datas.length; i++) {
  41. insert(datas[i]);
  42. }
  43. return root;
  44. }
  45. public void inOrder(TreeNode root) {
  46. if (root != null) {
  47. inOrder(root.left);
  48. System.out.print(root.data + " ");
  49. inOrder(root.right);
  50. }
  51. }
  52. public void preOrder(TreeNode root) {
  53. if (root != null) {
  54. System.out.print(root.data + " ");
  55. preOrder(root.left);
  56. preOrder(root.right);
  57. }
  58. }
  59. public void postOrder(TreeNode root) {
  60. if (root != null) {
  61. postOrder(root.left);
  62. postOrder(root.right);
  63. System.out.print(root.data + " ");
  64. }
  65. }
  66. public void bfs(TreeNode root) {
  67. Queue<TreeNode> queue = new LinkedList<>();
  68. queue.add(root);
  69. while (!queue.isEmpty()) {
  70. TreeNode current = queue.poll();
  71. if (current.left != null) {
  72. queue.add(current.left);
  73. }
  74. if (current.right != null) {
  75. queue.add(current.right);
  76. }
  77. System.out.print(" " + current.data);
  78. }
  79. }
  80. public void initTree(int[] preOrder, int[] inOrder) {
  81. this.root = this.initTree(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);
  82. }
  83. public TreeNode initTree(int[] preOrder, int leftPre, int rightPre, int[] inOrder, int leftIn, int rightIn) {
  84. if (leftPre > rightPre || leftIn > rightIn) {
  85. return null;
  86. }
  87. int rootData = preOrder[leftPre];
  88. TreeNode root = new TreeNode(rootData);
  89. int rootIndexInOrder = findRootIndex(inOrder, leftIn, rightIn, rootData);
  90. int offset = rootIndexInOrder - 1 - leftIn;
  91. TreeNode left = initTree(preOrder, leftPre + 1, leftPre + 1 + offset, inOrder, leftIn, leftIn + offset);
  92. TreeNode right = initTree(preOrder, leftPre + offset + 2, rightPre, inOrder, rootIndexInOrder + 1, rightIn);
  93. root.left = left;
  94. root.right = right;
  95. return root;
  96. }
  97. public void createTreeWithPreAndIn(int[] preOrder, int[] inOrder) {
  98. root = createTreeWithPreAndIn(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);
  99. }
  100. public TreeNode createTreeWithPreAndIn(int[] preOrder, int preLeft, int preRight, int[] inOrder, int inLeft, int inRight) {
  101. if (preLeft > preRight || inLeft > inRight) {
  102. return null;
  103. }
  104. int rootData = preOrder[preLeft];
  105. TreeNode root = new TreeNode(rootData);
  106. int rootIndexInInOrder = findRootIndex(inOrder, inLeft, inRight, rootData);
  107. int offset = rootIndexInInOrder - 1 - inLeft;
  108. TreeNode left = createTreeWithPreAndIn(preOrder, preLeft + 1, preLeft + 1 + offset, inOrder, inLeft, inLeft + offset);
  109. TreeNode right = createTreeWithPreAndIn(preOrder, preLeft + 1 + offset + 1, preRight, inOrder, rootIndexInInOrder + 1, inRight);
  110. root.left = left;
  111. root.right = right;
  112. return root;
  113. }
  114. public void createTreeWithPreAndPost(int[] preOrder, int[] postOrder) {
  115. }
  116. public void createTreeWithInAndPost(int[] inOrder, int[] postOrder) {
  117. root = createTreeWithInAndPost(inOrder, 0, inOrder.length - 1, postOrder, 0, postOrder.length - 1);
  118. }
  119. public TreeNode createTreeWithInAndPost(int[] inOrder, int inLeft, int inRight, int[] postOrder, int postLeft, int postRight) {
  120. if (inLeft > inRight || postLeft > postRight) {
  121. return null;
  122. }
  123. int rootData = postOrder[postRight];
  124. TreeNode root = new TreeNode(rootData);
  125. int rootIndexInInOrder = findRootIndex(inOrder, inLeft, inRight, rootData);
  126. int offset = rootIndexInInOrder - 1 - inLeft;
  127. TreeNode left = createTreeWithInAndPost(inOrder, inLeft, inLeft + offset, postOrder, postLeft, postLeft + offset);
  128. TreeNode right = createTreeWithInAndPost(inOrder, rootIndexInInOrder + 1, inRight, postOrder, postLeft + offset + 1, postRight - 1);
  129. root.left = left;
  130. root.right = right;
  131. return root;
  132. }
  133. public int findRootIndex(int[] inOrder, int leftIn, int rightIn, int target) {
  134. int result = -1;
  135. for (int i = leftIn; i <= rightIn; i++) {
  136. if (inOrder[i] == target) {
  137. result = i;
  138. break;
  139. }
  140. }
  141. return result;
  142. }
  143. }
  144. public class Solution {
  145. public static void main(String[] args) {
  146. BinaryTree tree = new BinaryTree();
  147. int[] nums = {1, 3, 4, 5, 6, 4, 3, 2};
  148. System.out.print("中序:");
  149. TreeNode root = tree.create(nums);
  150. tree.inOrder(root);
  151. System.out.println();
  152. System.out.print("先序:");
  153. tree.preOrder(root);
  154. System.out.println();
  155. System.out.print("后序:");
  156. tree.postOrder(root);
  157. System.out.println();
  158. System.out.print("层序:");
  159. tree.bfs(root);
  160. System.out.println();
  161. BinaryTree tree1 = new BinaryTree();
  162. int[] preOrder = {1, 2, 4, 8, 9, 5, 10, 3, 6, 7};
  163. int[] inOrder = {8, 4, 9, 2, 10, 5, 1, 6, 3, 7};
  164. // ? tree1.initTree(preOrder, inOrder);
  165. tree1.createTreeWithPreAndIn(preOrder, inOrder);
  166. System.out.print("后序:");
  167. tree1.postOrder(tree1.root);
  168. }
  169. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注