树的遍历【先序遍历】- 递归和非递归实现

太过爱你忘了你带给我的痛 2022-05-12 06:12 271阅读 0赞

代码

遍历该树

这里写图片描述

  1. package com.uj.nsnc.test;
  2. import org.junit.Test;
  3. import java.util.Stack;
  4. public class BinaryTreeTravel {
  5. class Node{
  6. public Node left;
  7. public Node right;
  8. public int value;
  9. Node(Node left, Node right, int value) {
  10. this.left = left;
  11. this.right = right;
  12. this.value = value;
  13. }
  14. }
  15. @Test
  16. public void testBinaryTreeTravel(){
  17. Node node4 = new Node(null,null,2);
  18. Node node5 = new Node(null,null,1);
  19. Node node3 = new Node(null, node5, 3);
  20. Node node2 = new Node(null, node4, 2);
  21. Node node1 = new Node(node2, node3, 1);
  22. PreOrderTravel(node1);
  23. PreOrderTravelByStack(node1);
  24. }
  25. /*=== 先序遍历 - 递归实现==*/
  26. private void PreOrderTravel(Node tree){
  27. if (tree == null) {
  28. return;
  29. }
  30. PreOrderTravel(tree.left);
  31. System.out.println(tree.value);
  32. PreOrderTravel(tree.right);
  33. }
  34. /*==== 先序遍历 - 非递归实现===*/
  35. private void PreOrderTravelByStack(Node tree){
  36. if(tree==null)
  37. return;
  38. Node temp = tree;
  39. Stack<Node> stack = new Stack<>();
  40. while (!stack.empty() || temp!=null) {
  41. /*====左子树压入栈===*/
  42. while (temp != null) {
  43. stack.push(temp);
  44. temp = temp.left;
  45. }
  46. Node node = stack.pop();
  47. System.out.println(node.value);
  48. /*=== 当前节点的右子树 ===*/
  49. temp = node.right;
  50. }
  51. }
  52. }

分析

递归和非递归相似点

  1. 递归使用函数栈
  2. 非递归方式使用一个

为什么是

  1. 遍历一个树,要实现可以回到遍历过的 节点
  1. * 再次回来是为了,完整遍历`当前节点` 的左右子树
  1. 递归方式会回到一个点3次, 手动栈 是 两次
  2. 此外,3次 可以用在很多场景。

发表评论

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

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

相关阅读