java栈实现二叉树的非递归遍历的示例代码

让我们来详细讲解一下“Java栈实现二叉树的非递归遍历的示例代码”的完整攻略。

什么是非递归遍历?

在讲解“Java栈实现二叉树的非递归遍历的示例代码”之前,我们先来了解一下什么是非递归遍历。

二叉树的遍历有三种方式:

  • 前序遍历:根节点 → 左子树 → 右子树。
  • 中序遍历:左子树 → 根节点 → 右子树。
  • 后序遍历:左子树 → 右子树 → 根节点。

在使用递归方式进行二叉树遍历时,会使用函数调用栈进行操作。而非递归方式则需要使用辅助数据结构,这里我们可以使用栈来帮助实现非递归遍历。

实现非递归遍历

前序遍历

对于前序遍历,我们可以使用栈来辅助实现。

首先将根节点压入栈中,然后重复下列步骤:

  • 弹出栈顶元素,记录该节点的值。
  • 如果该节点有右孩子,则将右孩子压入栈中。
  • 如果该节点有左孩子,则将左孩子压入栈中。

代码示例:

public void preorderTraversal(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    if (root != null) {
        stack.push(root);
    }
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        System.out.print(node.val + " ");
        if (node.right != null) {
            stack.push(node.right);
        }
        if (node.left != null) {
            stack.push(node.left);
        }
    }
}

中序遍历

对于中序遍历,我们可以通过先将左子树全部压入栈中,再弹出栈顶节点进行操作。

首先将根节点压入栈中,然后重复下列步骤:

  • 将该节点的所有左孩子依次压入栈中。
  • 弹出栈顶元素,记录该节点的值。
  • 如果该节点有右孩子,则将右孩子压入栈中。

代码示例:

public void inorderTraversal(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode curr = root;
    while (curr != null || !stack.isEmpty()) {
        while (curr != null) {
            stack.push(curr);
            curr = curr.left;
        }
        curr = stack.pop();
        System.out.print(curr.val + " ");
        curr = curr.right;
    }
}

后序遍历

对于后序遍历,我们需要记录节点是否已经被访问过。如果当前节点的左右子树都已经被访问过,则可以将当前节点出栈,否则,先将右子树压入栈中,再将左子树压入栈中。

首先将根节点压入栈中,然后重复下列步骤:

  • 如果该节点的左右子树都已经被访问过,则弹出栈顶元素并记录该节点的值。
  • 否则,依次检查右孩子和左孩子是否存在,如果存在则将它们压入栈中,否则记录该节点已经被访问过。

代码示例:

public void postorderTraversal(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode curr = root;       
    while (curr != null || !stack.isEmpty()) {
        while (curr != null) {
            stack.push(curr);
            curr = curr.left;
        }
        TreeNode topNode = stack.peek();
        if (topNode.right != null && topNode.right != curr) {
            curr = topNode.right;
        } else {
            System.out.print(topNode.val + " ");
            stack.pop();
            curr = null;
        }
    }
}

示例说明

针对于以上三种遍历方式的示例代码,我们可以使用以下二叉树进行测试:

        1
       / \
      2   3
     / \   \
    4   5   6

先序遍历结果为:1 2 4 5 3 6。

中序遍历结果为:4 2 5 1 3 6。

后序遍历结果为:4 5 2 6 3 1。

以上就是完整的“Java栈实现二叉树的非递归遍历”的详细攻略了。希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java栈实现二叉树的非递归遍历的示例代码 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • vue如何点击按钮返回上一页

    Vue如何点击按钮返回上一页 在Vue中,我们可以使用vue-router来进行路由管理。vue-router提供了$router对象和$route对象,分别用于管理路由和获取当前路由信息。 在vue-router中,为了实现前进和后退的功能,我们可以使用浏览器的history和pushState方法和popstate事件监听器来实现。而在Vue中,我们也可…

    其他 2023年3月29日
    00
  • 剖析C++的面向对象编程思想

    剖析C++的面向对象编程思想 1. 什么是面向对象编程(OOP) 面向对象编程是一种常用的编程思想,它将程序的组织方式从代码的角度转移到对象的角度。在面向对象编程中,我们将现实世界中的事物抽象成对象,这些对象具有属性(数据)和行为(方法),并且可以通过相互之间的交互来实现系统功能。 2. C++中的面向对象编程 C++是一种支持面向对象编程的多范式编程语言。…

    other 2023年6月28日
    00
  • 公开的免费STUN服务器

    关于“公开的免费STUN服务器”的完整攻略,我可以给您提供以下内容: 什么是STUN服务器 STUN服务器 (Session Traversal Utilities for NAT) 是一个协议,用于在网络中的NAT(网络地址转换)防火墙后建立点对点的通信。NAT防火墙会对本地网络(Private network)与公共互联网(Public Internet…

    other 2023年6月27日
    00
  • python基础之多态

    Python基础之多态 什么是多态 多态是一种对象编程的重要特性,可以让不同类的对象对同一消息作出不同的响应。这些不同的响应都是基于这些对象的类所定义的。 换句话说,多态是指通过相同的接口调用不同的类型对象所产生的不同结果。这就是所谓的“一个接口,多种实现”。 多态的实现方式 在Python中,实现多态有两种方式: 函数重写(方法重定义) 继承和多重继承 以…

    other 2023年6月26日
    00
  • sqlserver高级特性–存储过程

    以下是详细讲解“SQL Server高级特性–存储过程”的完整攻略,过程中至少包含两条示例说明的标准Markdown格式文本: SQL Server高级特性–存储过程 存储过程是SQL Server中的一种高级特性,它可以将一组SQL语句封装在一个可复用的单元中。本文将介绍如何创建和使用存储过程。 创建存储过程 在SQL Server中,可以使用CREA…

    other 2023年5月10日
    00
  • java获取系统路径字体、得到某个目录下的所有文件名、获取当前路径

    获取系统路径字体:在Java中,我们可以使用GraphicsEnvironment类来获取当前系统可用的字体名称,使用方法如下: import java.awt.*; public class FontNameDemo { public static void main(String[] args) { GraphicsEnvironment e = Gra…

    other 2023年6月26日
    00
  • python-如何使用pipfile和pipfile.lock?

    Python – 如何使用Pipfile和Pipfile.lock? Pipfile和Pipfile.lock是Python项目中的依赖管理工具,可以帮助我们更好地管理项目依赖。本文将介如何使用Pipfile和Pfile.lock。 1. 安装Pipenv 在使用Pipfile和Pipfile.lock之前,我们需要先装Pipenv。在命令行中执行以下命令即…

    other 2023年5月8日
    00
  • jquery实现加载进度条提示效果

    下面是jQuery实现加载进度条提示效果的完整攻略: 1. 引入jQuery和进度条插件 在标签中引入jQuery和进度条插件,比如nprogress: <head> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"&gt…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部