1

这棵树

无标题.jpg

  • 前序遍历:5 5 3 9 1 7 6 2 4 1
  • 中序遍历:9 3 1 5 5 2 6 4 7 1
  • 后序遍历:9 1 3 5 2 4 6 1 7 5
  • 层次遍历:5 5 7 3 6 1 9 1 2 4

前序遍历

递归实现

  // 前序遍历(递归)
  public static void preOrder(BinaryTree bt) {
    if (null != root) {
      System.out.print(bt.val + " ");
      preOrder(bt.left);
      preOrder(bt.right);
    }
  }

非递归实现

  • 利用栈,每次根节点入栈之后出栈,再依次将右子树节点和左子树节点入栈,直到栈空。
// 前序遍历(非递归:利用栈)
  public static void preOrder1(BinaryTree bt) {
    if (bt != null) {
      Stack<BinaryTree> tmp = new Stack<>();
      tmp.push(bt);
      while (!tmp.isEmpty()) {
        BinaryTree b = tmp.pop();
        System.out.print(b.val + " ");
        // 注意:先将右子树孩子压入栈,再将左子树压入栈
        if (b.right != null) {
          tmp.push(b.right);
        }
        if (b.left != null) {
          tmp.push(b.left);
        }
      }
    }
  }

中序遍历

递归实现

// 中序遍历(递归)
  public static void inOrder(BinaryTree bt) {
    if (bt != null) {
      inOrder(bt.left);
      System.out.print(bt.val + " ");
      inOrder(bt.right);
    }
  }

非递归实现

后序遍历

递归实现

 // 后序遍历(递归)
  public static void postOrder(BinaryTree bt) {
    if (bt != null) {
      postOrder(bt.left);
      postOrder(bt.right);
      System.out.print(bt.val + " ");
    }
  }

非递归实现

层次遍历

  • BFS
  • 用队列实现
  // 层次遍历
  public static void levelOrder(BinaryTree bt) {
    if (bt != null) {
      Queue<BinaryTree> tmp = new LinkedList<>();
      tmp.add(bt);
      while (!tmp.isEmpty()) {
        BinaryTree b = tmp.poll();
        System.out.print(b.val + " ");
        if (b.left != null) {
          tmp.add(b.left);
        }
        if (b.right != null) {
          tmp.add(b.right);
        }
      }
    }
  }

吃不完的土豆番茄
59 声望10 粉丝