当前位置:   article > 正文

Java实现二叉排序树(原创代码,包含插入、删除、查找)_java二叉排序树查找代码

java二叉排序树查找代码

二叉排序树 BST,也称二叉查找树。

二叉排序树的特点:

  1. 若左子树非空,则左子树上所有节点值均小于根节点的值。
  2. 若右子树非空,则右子树上所有节点值均大于根节点的值。

每一颗子树都是一颗二叉排序树。如下图:

下面我们直接上代码:

  1. package com.tree.binaryTree;
  2. //二叉排序树
  3. public class BinaryTree {
  4. public static void main(String[] args) {
  5. TreeNode treeNode = new TreeNode();
  6. treeNode.insert(50);
  7. treeNode.insert(25);
  8. treeNode.insert(70);
  9. treeNode.insert(21);
  10. treeNode.insert(35);
  11. treeNode.insert(60);
  12. treeNode.insert(84);
  13. treeNode.insert(13);
  14. treeNode.insert(30);
  15. treeNode.insert(40);
  16. treeNode.insert(56);
  17. treeNode.insert(67);
  18. treeNode.insert(86);
  19. treeNode.insert(32);
  20. treeNode.insert(38);
  21. treeNode.insert(58);
  22. treeNode.delete(35);
  23. treeNode.delete(50);
  24. }
  25. }
  26. class Node {
  27. int value;
  28. Node left;
  29. Node right;
  30. public Node(int value) {
  31. this.value = value;
  32. }
  33. }
  34. class TreeNode {
  35. Node root;
  36. /**
  37. * 插入节点
  38. */
  39. public void insert(int value) {
  40. if (root == null) {
  41. root = new Node(value);
  42. return;
  43. }
  44. Node node = root;
  45. while (true) {
  46. if (node.value > value) {
  47. if (node.left == null) {
  48. node.left = new Node(value);
  49. return;
  50. } else {
  51. node = node.left;
  52. }
  53. } else {
  54. if (node.right == null) {
  55. node.right = new Node(value);
  56. return;
  57. } else {
  58. node = node.right;
  59. }
  60. }
  61. }
  62. }
  63. /**
  64. * 寻找节点
  65. */
  66. public boolean search(int value) {
  67. Node node = root;
  68. while (node != null && value != node.value) {
  69. if (node.value > value) {
  70. node = node.left;
  71. } else {
  72. node = node.right;
  73. }
  74. }
  75. return node != null;
  76. }
  77. public void delete(int value) {
  78. Node node = root;
  79. Node temp = node;
  80. while (node != null) {
  81. //保存当前节点
  82. if (node.value == value) {
  83. //若node节点为尾巴节点,直接将node赋值为null
  84. if (node.left == null && node.right == null) {
  85. if(temp.left == node){
  86. temp.left = null;
  87. return;
  88. }else if(temp.right == node){
  89. temp.right = null;
  90. return;
  91. }else {
  92. root = null;
  93. return;
  94. }
  95. }
  96. //若node节点左子节点为空
  97. if (node.left == null) {
  98. Node min = findMin(node.right);
  99. if (min == node.right) {
  100. node.value = min.value;
  101. node.right = min.right;
  102. } else {
  103. node.value = min.left.value;
  104. min.left = min.left.right;
  105. }
  106. return;
  107. }
  108. //若node节点左子节点不为空
  109. Node max = findMax(node.left);
  110. if (max == node.left) {
  111. node.value = max.value;
  112. node.left = max.left;
  113. } else {
  114. node.value = max.right.value;
  115. max.right = max.right.left;
  116. }
  117. return;
  118. } else {
  119. //往下找到value值对应的节点
  120. if (node.value > value) {
  121. temp = node;
  122. node = node.left;
  123. } else {
  124. temp = node;
  125. node = node.right;
  126. }
  127. }
  128. }
  129. }
  130. /**
  131. * 找到左子树的最大节点的前一个节点
  132. */
  133. public Node findMax(Node node) {
  134. if (node.right == null) {
  135. return node;
  136. }
  137. Node temp = null;
  138. while (node.right != null) {
  139. temp = node;
  140. node = node.right;
  141. }
  142. return temp;
  143. }
  144. /**
  145. * 找到右子树的最小节点的前一个节点
  146. */
  147. public Node findMin(Node node) {
  148. if (node.left == null) {
  149. return node;
  150. }
  151. Node temp = null;
  152. while (node.left != null) {
  153. temp = node;
  154. node = node.left;
  155. }
  156. return temp;
  157. }
  158. }

树的原型为:

删除后为:

 

在测试过程中遇到任何问题可以debug一下,如果解决不了可以在评论区留言,我会帮助你解决问题,欢迎大家积极评论!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/528326
推荐阅读
相关标签
  

闽ICP备14008679号