歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 二叉查找樹 Java實現

二叉查找樹 Java實現

日期:2017/3/1 10:38:48   编辑:Linux編程
  1. package ctgu.sugite.content.character12;
  2. import ctgu.sugite.content.character10.LinkedStack;
  3. public class BinarySearchTree<E> {
  4. private static class TreeNode<E> {
  5. E key;
  6. TreeNode<E> lChild;
  7. TreeNode<E> rChild;
  8. TreeNode<E> parent;
  9. public TreeNode(E e, TreeNode<E> left, TreeNode<E> right,
  10. TreeNode<E> parent) {
  11. this.key = e;
  12. this.lChild = left;
  13. this.rChild = right;
  14. this.parent = parent;
  15. }
  16. }
  17. private TreeNode<E> root = new TreeNode<E>(null, null, null, null);
  18. public BinarySearchTree() {
  19. root.parent = root.lChild = root.rChild = root;
  20. }
  21. public void treeInorder(TreeNode<E> tn) {// 非遞歸的中序遍歷
  22. LinkedStack<TreeNode<E>> stack = new LinkedStack<TreeNode<E>>();
  23. TreeNode<E> p = tn;
  24. while (p != null || !stack.isEmpty()) {
  25. if (p != null) {
  26. stack.push(p);
  27. p = p.lChild;
  28. } else {
  29. p = stack.pop();
  30. System.out.print(p.key + " ");
  31. p = p.rChild;
  32. }
  33. }
  34. System.out.println();
  35. }
  36. public TreeNode<E> treeSearch(TreeNode<E> tn, E e) {// 二叉查找
  37. int result = compare(e, tn.key);
  38. if (result == 0 || tn == null)
  39. return tn;
  40. if (result < 0)
  41. return treeSearch(tn.lChild, e);
  42. else
  43. return treeSearch(tn.rChild, e);
  44. }
  45. public TreeNode<E> treeMinimum(TreeNode<E> tn) {// 樹中最小值
  46. while (tn.lChild != null)
  47. tn = tn.lChild;
  48. return tn;
  49. }
  50. public TreeNode<E> treeMaximum(TreeNode<E> tn) {// 樹中最大值
  51. while (tn.rChild != null)
  52. tn = tn.rChild;
  53. return tn;
  54. }
  55. public TreeNode<E> treeSuccessor(TreeNode<E> tn) {// 結點後繼
  56. if (tn.rChild != null)
  57. return treeMinimum(tn.rChild);
  58. TreeNode<E> p = tn.parent;
  59. while (p != null && tn == p.rChild) {
  60. tn = p;
  61. p = p.parent;
  62. }
  63. return p;
  64. }
  65. public TreeNode<E> treePredecessor(TreeNode<E> tn) {// 結點前趨
  66. if (tn.lChild != null)
  67. return treeMaximum(tn.lChild);
  68. TreeNode<E> p = tn.parent;
  69. while (p != null && tn == p.lChild) {
  70. tn = p;
  71. p = p.parent;
  72. }
  73. return p;
  74. }
  75. public void treeInsert(BinarySearchTree<E> tree, E e) {// 插入結點
  76. TreeNode<E> z = new TreeNode<E>(e, null, null, null);
  77. TreeNode<E> y = new TreeNode<E>(null, null, null, null);
  78. TreeNode<E> x = tree.getRoot();
  79. while (x.key != null) {
  80. y = x;
  81. if (compare(e, x.key) < 0)
  82. x = x.lChild;
  83. else
  84. x = x.rChild;
  85. if (x == null) {
  86. x = new TreeNode<E>(null, null, null, null);
  87. }
  88. }
  89. z.parent = y;
  90. if (y.key == null) {
  91. tree.setRoot(z);
  92. } else {
  93. if (compare(e, y.key) < 0)
  94. y.lChild = z;
  95. else
  96. y.rChild = z;
  97. }
  98. }
  99. public TreeNode<E> treeDelete(BinarySearchTree<E> tree, E e) {// 刪除結點
  100. TreeNode<E> z = treeSearch(tree.getRoot(), e);
  101. TreeNode<E> y = new TreeNode<E>(null, null, null, null);
  102. TreeNode<E> x = new TreeNode<E>(null, null, null, null);
  103. if (z.lChild == null || z.rChild == null)
  104. y = z;
  105. else
  106. y = treeSuccessor(z);
  107. x = (y.lChild == null) ? y.rChild : y.lChild;
  108. if (x != null)
  109. x.parent = y.parent;
  110. if (y.parent == null)
  111. tree.setRoot(x);
  112. else {
  113. if (y == y.parent.lChild)
  114. y.parent.lChild = x;
  115. else
  116. y.parent.rChild = x;
  117. }
  118. if (y != z)
  119. z.key = y.key;
  120. return y;
  121. }
  122. public TreeNode<E> getRoot() {
  123. return this.root;
  124. }
  125. public void setRoot(TreeNode<E> root) {
  126. this.root = root;
  127. }
  128. @SuppressWarnings({ "unchecked" })
  129. private int compare(E a, E b) {
  130. return ((Comparable<E>) a).compareTo(b);
  131. }
  132. public static void main(String[] args) {
  133. BinarySearchTree<Integer> bst = new BinarySearchTree<Integer>();
  134. int[] a = { 50, 9, 3, 78, 23, 0, 2, 4, 6, 6 };
  135. for (int i = 0; i < a.length; i++) {
  136. bst.treeInsert(bst, new Integer(a[i]));
  137. }
  138. bst.treeInorder(bst.getRoot());
  139. bst.treeDelete(bst, new Integer(6));
  140. bst.treeInorder(bst.getRoot());
  141. bst.treeDelete(bst, new Integer(0));
  142. bst.treeInorder(bst.getRoot());
  143. System.out.println("root is :" + bst.getRoot().key);
  144. System.out.println("root's successor is :"
  145. + bst.treeSuccessor(bst.getRoot()).key);
  146. System.out.println("root's predecessor is :"
  147. + bst.treePredecessor(bst.getRoot()).key);
  148. System.out.println("max value is :"
  149. + bst.treeMaximum(bst.getRoot()).key);
  150. System.out.println("min value is :"
  151. + bst.treeMinimum(bst.getRoot()).key);
  152. }
  153. }

運行結果:

0 2 3 4 6 6 9 23 50 78
0 2 3 4 6 9 23 50 78
2 3 4 6 9 23 50 78
root is :50
root's successor is :78
root's predecessor is :23
max value is :78
min value is :2

Copyright © Linux教程網 All Rights Reserved