当前位置:   article > 正文

数据结构——在二叉树中查找指定的节点(Java)_java二叉树中有没有这个节点

java二叉树中有没有这个节点

依据二叉树的遍历方式,查找二叉树中的指定的节点,也有三种方式:

按照前序遍历的顺序查找:

正确代码:

  1. public Node preOrderSearch(int num) {
  2. System.out.println("当前的节点数值为:" + this.num);
  3. Node res = null;
  4. if (this.num == num) {
  5. return this;
  6. }
  7. if (this.left != null) {
  8. res = this.left.preOrderSearch(num);
  9. }
  10. if (res != null) {
  11. return res;
  12. }
  13. if (this.right != null) {
  14. res = this.right.preOrderSearch(num);
  15. }
  16. return res;
  17. }

 在刚开始的时候,我认为没必要设置一个res的变量记录this.left.preOrderSearch(num)或者this.right.preOrderSearch(num)的值,思路和前序遍历的一样,只要判断该节点的值是不是要找的那个值即可,但是在运行代码以后,发现了问题。代码中构建的二叉树如下图所示。

(个人觉得:弄清楚递归程序最好的方式就是debug)

假设,要找到值为5的节点

递归程序的运行是这样的:【如果看不下去,可以直接设断点调试】

节点1,判断1和5的值相不相等,结果是不相等,判断左节点不为空,则进入左节点,左节点2与5不相等,则判断节点2有无左节点,节点2没有左节点,这时res=null,判断节点2有没有右节点,节点2没有右节点,所以回退到节点1判断左节点的时候,res的值为null,接着判断节点1的右节点是否为空,右节点不为空,进入右节点3,3不等于5,则继续判断节点3的左节点,节点3的左节点是5,这时,节点5就是我们要找的节点,则会把该节点返回,注意,返回到的节点是节点3的左节点判断语句,这时res被赋值为节点5,跳出if,进入判断res是否为空if语句,这时返回res,返回的值是到了节点1的右节点判断语句,res被赋值为节点5,这时节点1的左节点和右节点都判断完毕了,返回res,就可以输出了。

中序遍历和后序遍历也都是一样的理解方式。

单从要查找节点5这个具体的例子来说,后续遍历能够最快找到。

 

按照中序遍历的顺序查找

  1. public Node infixOrderSearch(int num) {
  2. Node res = null;
  3. if (this.left != null) {
  4. res = this.left.infixOrderSearch(num);
  5. }
  6. if (res != null) {
  7. return res;
  8. }
  9. System.out.println("当前的节点数值为:" + this.num);
  10. if (this.num == num) {
  11. return this;
  12. }
  13. if (this.right != null) {
  14. res = this.right.infixOrderSearch(num);
  15. }
  16. return res;
  17. }

按照后序遍历的顺序查找

  1. public Node postOrderSearch(int num) {
  2. Node res = null;
  3. if (this.left != null) {
  4. res = this.left.postOrderSearch(num);
  5. }
  6. if (res != null) {
  7. return res;
  8. }
  9. if (this.right != null) {
  10. res = this.right.postOrderSearch(num);
  11. }
  12. if (res != null) {
  13. return res;
  14. }
  15. System.out.println("当前的节点数值为:" + this.num);
  16. if (this.num == num) {
  17. return this;
  18. }
  19. return res;
  20. }

完整的代码(可直接运行):

  1. package tree;
  2. public class BinaryTreeDemo {
  3. public static void main(String[] args) {
  4. //创建一棵二叉树
  5. BinaryTree binaryTree = new BinaryTree();
  6. //创建需要的节点
  7. Node root = new Node(1);
  8. Node n2 = new Node(2);
  9. Node n3 = new Node(3);
  10. Node n4 = new Node(4);
  11. //新增加的节点
  12. Node n5 = new Node(5);
  13. //暂时手动创建二叉树
  14. root.setLeft(n2);
  15. root.setRight(n3);
  16. n3.setRight(n4);
  17. n3.setLeft(n5);
  18. //测试
  19. //前序遍历 :1 2 3 4
  20. //添加节点之后 : 1 2 3 5 4
  21. System.out.println("前序遍历");
  22. binaryTree.setRoot(root);
  23. binaryTree.preOrder();
  24. //中序遍历 :2 1 3 4
  25. //添加节点之后 :2 1 5 3 4
  26. System.out.println("中序遍历");
  27. binaryTree.infixOrder();
  28. //后序遍历 2 4 3 1
  29. //添加节点之后 :2 5 4 3 1
  30. System.out.println("后序遍历");
  31. binaryTree.postOrder();
  32. //前序遍历查找
  33. System.out.println("前序遍历查找:");
  34. System.out.println(binaryTree.preOrderSearch(5));
  35. // System.out.println("中序遍历查找:");
  36. // System.out.println(binaryTree.infixOrderSearch(5));
  37. // System.out.println("后序遍历查找:");
  38. // System.out.println(binaryTree.postOrderSearch(5));
  39. }
  40. }
  41. class BinaryTree {
  42. private Node root;
  43. public void setRoot(Node root) {
  44. this.root = root;
  45. }
  46. //前序遍历
  47. public void preOrder() {
  48. if (this.root != null) {
  49. this.root.preOrder();
  50. } else {
  51. System.out.println("当前二叉树为空,无法遍历!");
  52. }
  53. }
  54. //中序遍历
  55. public void infixOrder() {
  56. if (this.root != null) {
  57. this.root.infixOrder();
  58. } else {
  59. System.out.println("当前二叉树为空,无法遍历!");
  60. }
  61. }
  62. //后序遍历
  63. public void postOrder() {
  64. if (this.root != null) {
  65. this.root.postOrder();
  66. } else {
  67. System.out.println("当前二叉树为空,无法遍历!");
  68. }
  69. }
  70. public Node preOrderSearch(int num) {
  71. if (root != null) {
  72. return root.preOrderSearch(num);
  73. }
  74. return null;
  75. }
  76. public Node infixOrderSearch(int num) {
  77. if (root != null) {
  78. return root.infixOrderSearch(num);
  79. }
  80. return null;
  81. }
  82. public Node postOrderSearch(int num) {
  83. if (root != null) {
  84. return root.postOrderSearch(num);
  85. }
  86. return null;
  87. }
  88. }
  89. class Node {
  90. private int num;
  91. private Node left;
  92. private Node right;
  93. public Node(int num) {
  94. this.num = num;
  95. }
  96. public int getNum() {
  97. return num;
  98. }
  99. public void setNum(int num) {
  100. this.num = num;
  101. }
  102. public Node getLeft() {
  103. return left;
  104. }
  105. public void setLeft(Node left) {
  106. this.left = left;
  107. }
  108. public Node getRight() {
  109. return right;
  110. }
  111. public void setRight(Node right) {
  112. this.right = right;
  113. }
  114. @Override
  115. public String toString() {
  116. return "Node{" +
  117. "num=" + num +
  118. '}';
  119. }
  120. //前序遍历
  121. public void preOrder() {
  122. System.out.println(this);
  123. if (this.left != null) {
  124. this.left.preOrder();
  125. }
  126. if (this.right != null) {
  127. this.right.preOrder();
  128. }
  129. }
  130. //中序遍历
  131. public void infixOrder() {
  132. if (this.left != null) {
  133. this.left.infixOrder();
  134. }
  135. System.out.println(this);
  136. if (this.right != null) {
  137. this.right.infixOrder();
  138. }
  139. }
  140. //后序遍历
  141. public void postOrder() {
  142. if (this.left != null) {
  143. this.left.postOrder();
  144. }
  145. if (this.right != null) {
  146. this.right.postOrder();
  147. }
  148. System.out.println(this);
  149. }
  150. // 前序遍历查找指定的节点
  151. public Node preOrderSearch(int num) {
  152. System.out.println("当前的节点数值为:" + this.num);
  153. Node res = null;
  154. if (this.num == num) {
  155. return this;
  156. }
  157. if (this.left != null) {
  158. res = this.left.preOrderSearch(num);
  159. }
  160. if (res != null) {
  161. return res;
  162. }
  163. if (this.right != null) {
  164. res = this.right.preOrderSearch(num);
  165. }
  166. return res;
  167. }
  168. //中序遍历查找指定的节点
  169. public Node infixOrderSearch(int num) {
  170. Node res = null;
  171. if (this.left != null) {
  172. res = this.left.infixOrderSearch(num);
  173. }
  174. if (res != null) {
  175. return res;
  176. }
  177. System.out.println("当前的节点数值为:" + this.num);
  178. if (this.num == num) {
  179. return this;
  180. }
  181. if (this.right != null) {
  182. res = this.right.infixOrderSearch(num);
  183. }
  184. return res;
  185. }
  186. //后序遍历查找指定的节点
  187. public Node postOrderSearch(int num) {
  188. Node res = null;
  189. if (this.left != null) {
  190. res = this.left.postOrderSearch(num);
  191. }
  192. if (res != null) {
  193. return res;
  194. }
  195. if (this.right != null) {
  196. res = this.right.postOrderSearch(num);
  197. }
  198. if (res != null) {
  199. return res;
  200. }
  201. System.out.println("当前的节点数值为:" + this.num);
  202. if (this.num == num) {
  203. return this;
  204. }
  205. return res;
  206. }
  207. }

运行部分结果:

  1. 前序遍历查找:
  2. 当前的节点数值为:1
  3. 当前的节点数值为:2
  4. 当前的节点数值为:3
  5. 当前的节点数值为:5
  6. Node{num=5}

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

闽ICP备14008679号