树的递归遍历和非递归遍历

红太狼 2022-02-27 23:52 488阅读 0赞
  1. public class TreeNode {
  2. private int value;
  3. private TreeNode left;
  4. private TreeNode right;
  5. public TreeNode(int value, TreeNode left, TreeNode right){
  6. this.value = value;
  7. this.left = left;
  8. this.right = right;
  9. }
  10. public int getValue() {
  11. return value;
  12. }
  13. public TreeNode getLeft() {
  14. return left;
  15. }
  16. public TreeNode getRight() {
  17. return right;
  18. }
  19. }
  20. public static void main(String[] args) {
  21. printByNonRecursive();
  22. printByRecursive();
  23. }
  24. private static void printByNonRecursive(){
  25. TreeNode treeNode = buildTree();
  26. System.out.println("\n=======非递归访问结果======\n");
  27. System.out.print("前序:\t");
  28. preOrderByNonRecursive(treeNode);
  29. System.out.print("\n中序:\t");
  30. inOrderByNonRecursive(treeNode);
  31. System.out.print("\n后序:\t");
  32. postOrderByNonRecursive(treeNode);
  33. }
  34. /**
  35. * 利用栈保存访问路径
  36. * node 标示遍历的当前节点,如果当前节点为空,则置为null
  37. */
  38. private static void preOrderByNonRecursive(TreeNode root){
  39. Deque<TreeNode> stack = new LinkedList();
  40. TreeNode node = root;
  41. while (node != null || !stack.isEmpty()){
  42. //遍历,直到左子树为空
  43. while (node != null){
  44. System.out.print(node.getValue() + "\t");
  45. stack.push(node);
  46. node = node.getLeft();
  47. }
  48. //弹出栈顶元素并遍历右子树
  49. while (!stack.isEmpty()){
  50. node = stack.pop().getRight();
  51. //右子树不空,则需要进行右子树的左子树遍历;右子树为空,则继续弹出栈顶元素
  52. if (node != null){
  53. break;
  54. }
  55. }
  56. }
  57. }
  58. private static void inOrderByNonRecursive(TreeNode root){
  59. Deque<TreeNode> stack = new LinkedList<>();
  60. TreeNode node = root;
  61. while(node != null || !stack.isEmpty()){
  62. //遍历左子树
  63. while (node != null){
  64. stack.push(node);
  65. node = node.getLeft();
  66. }
  67. //弹出、访问栈顶元素,并遍历右子树
  68. while(!stack.isEmpty()){
  69. node = stack.pop();
  70. System.out.print(node.getValue() + "\t");
  71. node = node.getRight();
  72. if (node != null){
  73. break;
  74. }
  75. }
  76. }
  77. }
  78. private static void postOrderByNonRecursive(TreeNode root){
  79. Deque<TreeNode> stack = new LinkedList<>();
  80. TreeNode node = root;
  81. while (node != null || !stack.isEmpty()){
  82. //访问左子树
  83. while (node != null){
  84. stack.push(node);
  85. node = node.getLeft();
  86. }
  87. //弹出栈顶指针,访问右子树
  88. while (!stack.isEmpty()){
  89. //获取到栈顶元素,但不弹出
  90. node = stack.peek();
  91. if(node.getRight() != null){
  92. node = node.getRight();
  93. break;
  94. }else{
  95. //如果栈顶元素没有右子树则弹出,并且如果是右孩子,还需要弹出其父节点
  96. TreeNode right;
  97. do {
  98. right = stack.pop();
  99. System.out.print(right.getValue() + "\t");
  100. }while (!stack.isEmpty() && right == stack.peek().getRight());
  101. node = null;
  102. }
  103. }
  104. }
  105. }
  106. private static void printByRecursive(){
  107. TreeNode treeNode = buildTree();
  108. System.out.println("\n=======递归访问结果======\n");
  109. System.out.print("前序:\t");
  110. preOrderByRecursive(treeNode);
  111. System.out.print("\n中序:\t");
  112. inOrderByRecursive(treeNode);
  113. System.out.print("\n后序:\t");
  114. postOrderByRecursive(treeNode);
  115. }
  116. private static void preOrderByRecursive(TreeNode node){
  117. if(node == null){
  118. return;
  119. }
  120. System.out.print(node.getValue() + "\t");
  121. preOrderByRecursive(node.getLeft());
  122. preOrderByRecursive(node.getRight());
  123. }
  124. private static void inOrderByRecursive(TreeNode node){
  125. if (node == null){
  126. return;
  127. }
  128. inOrderByRecursive(node.getLeft());
  129. System.out.print(node.getValue() + "\t");
  130. inOrderByRecursive(node.getRight());
  131. }
  132. private static void postOrderByRecursive(TreeNode node){
  133. if (node == null){
  134. return;
  135. }
  136. postOrderByRecursive(node.getLeft());
  137. postOrderByRecursive(node.getRight());
  138. System.out.print(node.getValue() + "\t");
  139. }
  140. /**
  141. * 100
  142. * 50 80
  143. * 9 30 20 90
  144. * 3 15 16 25 150
  145. * 45 12 30
  146. * 前序: 100 50 9 3 30 15 45 12 80 20 16 25 30 90 150
  147. * 中序: 3 9 50 30 45 15 12 100 16 20 25 30 80 150 90
  148. * 后序: 3 9 45 12 25 30 50 16 30 25 20 150 90 80 100
  149. */
  150. private static TreeNode buildTree(){
  151. TreeNode left = new TreeNode(45, null, null);
  152. TreeNode right = new TreeNode(12, null, null);
  153. TreeNode root = new TreeNode(15, left, right);
  154. root = new TreeNode(30, null, root);
  155. left = new TreeNode(3, null, null);
  156. TreeNode r1 = new TreeNode(9, left, null);
  157. root = new TreeNode(50, r1, root);
  158. left = new TreeNode(16, null, null);
  159. right = new TreeNode(25, null, new TreeNode(30, null, null));
  160. r1 = new TreeNode(80, new TreeNode(20, left, right), new TreeNode(90, new TreeNode(150, null, null), null));
  161. return new TreeNode(100, root, r1);
  162. }

发表评论

表情:
评论列表 (有 0 条评论,488人围观)

还没有评论,来说两句吧...

相关阅读