当前位置:   article > 正文

二叉树遍历(前序遍历、中序遍历、后序遍历)_现在给出一对后序和前序遍历序列,您应该输出树的相应的中序遍历序列。如果树不是

现在给出一对后序和前序遍历序列,您应该输出树的相应的中序遍历序列。如果树不是

1.说明

  1. 前序遍历: 先输出父节点,再遍历左子树和右子树

  2. 中序遍历: 先遍历左子树,再输出父节点,再遍历右子树

  3. 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点

  4. 小结: 看输出父节点的顺序,就确定是前序,中序还是后序

2.分析遍历的步骤

1.先创建一棵二叉树

2.前序遍历

2.1 先输出当前结点(初始时为根结点root)

2.2 如果左子结点不为空,则递归继续前序遍历

2.3如果右子结点不为空,则递归继续前序遍历

3.中序遍历

3.1 如果当前结点左子结点不为空,则递归继续中序遍历

3.2 输出当前结点

3.3 如果当前结点右子结点不为空,则递归继续中序遍历

4.后序遍历

4.1 如果当前结点左子结点不为空,则递归继续后续遍历

4.2 如果当前结点右子结点不为空,则递归继续后续遍历

4.3 输出当前结点

3.代码实现

  1. public class BinaryTreeDemo {
  2. public static void main(String[] args) {
  3. // 第三步:将结点连接形成二叉树(在main方法中实现)
  4. BinaryTree binaryTree = new BinaryTree();
  5. //创建需要的结点
  6. HeroNode root = new HeroNode(1, "宋江");
  7. HeroNode heroNode2 = new HeroNode(2, "吴用");
  8. HeroNode heroNode3 = new HeroNode(3, "卢俊义");
  9. HeroNode heroNode4 = new HeroNode(4, "关胜");
  10. HeroNode heroNode5 = new HeroNode(5, "林冲");
  11. // 注意
  12. binaryTree.setRoot(root);
  13. //手动创建二叉树
  14. root.setLeft(heroNode2);
  15. root.setRight(heroNode3);
  16. heroNode3.setLeft(heroNode4);
  17. heroNode3.setRight(heroNode5);
  18. //测试遍历
  19. System.out.println("前序遍历");
  20. binaryTree.preOrder();// 1 2 3 4 5
  21. System.out.println("中序遍历");
  22. binaryTree.infixOrder();// 2 1 4 3 5
  23. System.out.println("后序遍历");
  24. binaryTree.postOrder();// 2 4 5 3 1
  25. }
  26. }
  27. // 第一步:先创建HeroNode结点
  28. // 第二步:创建二叉树
  29. // 第三步:将结点连接形成二叉树(在main方法中实现)
  30. // 第二步:创建二叉树
  31. class BinaryTree{
  32. // 定义根结点
  33. private HeroNode root;
  34. // 创建根结点
  35. public void setRoot(HeroNode root){
  36. this.root = root;
  37. }
  38. // 前序遍历
  39. public void preOrder(){
  40. if (this.root != null) {
  41. this.root.preOrder();
  42. } else {
  43. System.out.println("二叉树为空,不能遍历");
  44. }
  45. }
  46. // 中序遍历
  47. public void infixOrder(){
  48. if (this.root != null) {
  49. this.root.infixOrder();
  50. } else {
  51. System.out.println("二叉树为空,不能遍历");
  52. }
  53. }
  54. // 后序遍历
  55. public void postOrder(){
  56. if (this.root != null) {
  57. this.root.postOrder();
  58. } else {
  59. System.out.println("二叉树为空,不能遍历");
  60. }
  61. }
  62. }
  63. //第一步:先创建HeroNode结点
  64. class HeroNode{
  65. private int no;
  66. private String name;
  67. private HeroNode left;//左子结点,默认值为null
  68. private HeroNode right;//右子结点
  69. public HeroNode(int no, String name) {
  70. this.no = no;
  71. this.name = name;
  72. }
  73. public int getNo() {
  74. return no;
  75. }
  76. public void setNo(int no) {
  77. this.no = no;
  78. }
  79. public String getName() {
  80. return name;
  81. }
  82. public void setName(String name) {
  83. this.name = name;
  84. }
  85. public HeroNode getLeft() {
  86. return left;
  87. }
  88. public void setLeft(HeroNode left) {
  89. this.left = left;
  90. }
  91. public HeroNode getRight() {
  92. return right;
  93. }
  94. public void setRight(HeroNode right) {
  95. this.right = right;
  96. }
  97. @Override
  98. public String toString() {
  99. return "HeroNode [no=" + no + ", name=" + name + "]";
  100. }
  101. // 编写前序遍历的方法
  102. public void preOrder(){
  103. // 输出当前结点
  104. System.out.println(this);
  105. //递归遍历左子结点
  106. if (this.left != null) {
  107. this.left.preOrder();
  108. }
  109. //递归遍历右子结点
  110. if (this.right != null) {
  111. this.right.preOrder();
  112. }
  113. }
  114. //编写中序遍历的方法
  115. public void infixOrder(){
  116. //递归遍历左子结点
  117. if (this.left != null) {
  118. this.left.infixOrder();
  119. }
  120. //输出当前结点
  121. System.out.println(this);
  122. //递归遍历右子结点
  123. if (this.right != null) {
  124. this.right.infixOrder();
  125. }
  126. }
  127. //后序遍历
  128. public void postOrder(){
  129. //遍历左子结点
  130. if (this.left != null) {
  131. this.left.postOrder();
  132. }
  133. // 遍历右子结点
  134. if (this.right != null) {
  135. this.right.postOrder();
  136. }
  137. // 输出当前结点
  138. System.out.println(this);
  139. }
  140. }

4.测试代码中二叉树图

1659965172355

求二叉树的深度

  1. //求二叉树的深度
  2. public int getDepth(HeroNode root) {
  3. int LD,RD;//左二叉树,右二叉树的深度
  4. if (root == null) {
  5. return 0;
  6. }else {
  7. LD = getDepth(root.getLeft());
  8. RD = getDepth(root.getRight());
  9. return (LD>RD ? LD : RD) +1;
  10. }
  11. }

5.Java中this知识点补充

可以通过debug来加深对代码的理解

this的类型:哪个对象调用就是哪个对象的引用类型

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

闽ICP备14008679号