二叉树 前序遍历

发布于 2024-07-18 09:39:08 字数 1894 浏览 15 评论 0

1、递归前序

static void preOrder(Node T) {
  if (T == null)
    return;
  System.out.print(T.val + " ");
  preOrder(T.left);
  preOrder(T.right);
}

2、非递归前序

前序遍历顺序为: 根结点->左子树->右子树,所以对于正在访问的根结点,可以直接访问,访问完之后,按照相同的方式访问左子树,再访问右子树,过程如下 :

  • 如果当前节点 p 不为空,访问结点 p ,并将结点 p 入栈,并继续访问左子树(直到左子树为空);
  • 否则将栈顶元素出栈,并访问栈顶的元素的右子树;
  • 直到栈为空且 p 为空,循环结束。
static void iterativePre(Node root) {
  Stack<Node> s = new Stack<>();
  Node p = root;
  while (!s.empty() || p != null) {
    if (p != null) {//也可以写一个 while 循环,直到左子树为空
      s.push(p);
      System.out.print(p.val + " ");
      p = p.left;
    } else {
      p = s.pop();
      p = p.right;
    }
  }
}

也可以将上面的一直访问到左子树为空写成一个 while 循环:

static void iterativePre2(Node root) {
  Stack<Node> s = new Stack<>();
  Node p = root;
  while (!s.empty() || p != null) {
    while (p != null) { // while 循环,直到左子树为空
      s.push(p);
      System.out.print(p.val + " ");
      p = p.left;
    }
    p = s.pop();
    p = p.right;
  }
}

还有另外一种写法是:

  • 先把根节点入栈,然后每次出栈一个元素,先访问这个元素,然后如果它的右子树存在,就入栈,如果它的左子树存在也入栈;
  • 为什么要先入右子树呢,因为,前序遍历是中->左->右,而栈可以逆序,所以先右再左;

这个方法在后续遍历的双栈法中有体现,那个只是这个稍微的修改。

static void iterativePre3(Node root) {
  if (root == null)
    return;
  Node p = root;
  Stack<Node> stack = new Stack<>();
  stack.add(p);
  while (!stack.isEmpty()) {
    p = stack.pop();
    System.out.print(p.val + " ");
    if (p.right != null)// 先右再左即可
      stack.push(p.right);
    if (p.left != null)
      stack.push(p.left);
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

早乙女

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文