Java语言实现非递归实现树的前中后序遍历总结

yizhihongxing

Java语言实现非递归实现树的前中后序遍历总结

为什么要用非递归实现树的遍历?

树的遍历可以使用递归实现,但是递归实现有可能导致栈溢出的问题,尤其是当树的层数比较深时。因此,使用非递归实现树的遍历可以避免这个问题。

非递归实现树的前序遍历

前序遍历的顺序是:根节点 --> 左子树 --> 右子树

public void preorder(Node root) {
    if (root == null) {
        return;
    }
    Stack<Node> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        Node node = stack.pop();
        visit(node);
        if (node.right != null) {
            stack.push(node.right);
        }
        if (node.left != null) {
            stack.push(node.left);
        }
    }
}

非递归实现树的中序遍历

中序遍历的顺序是:左子树 --> 根节点 --> 右子树

public void inorder(Node root) {
    if (root == null) {
        return;
    }
    Stack<Node> stack = new Stack<>();
    Node node = root;
    while (node != null || !stack.isEmpty()) {
        if (node != null) {
            stack.push(node);
            node = node.left;
        } else {
            node = stack.pop();
            visit(node);
            node = node.right;
        }
    }
}

非递归实现树的后序遍历

后序遍历的顺序是:左子树 --> 右子树 --> 根节点

public void postorder(Node root) {
    if (root == null) {
        return;
    }
    Stack<Node> stack1 = new Stack<>();
    Stack<Node> stack2 = new Stack<>();
    stack1.push(root);
    while (!stack1.isEmpty()) {
        Node node = stack1.pop();
        stack2.push(node);
        if (node.left != null) {
            stack1.push(node.left);
        }
        if (node.right != null) {
            stack1.push(node.right);
        }
    }
    while (!stack2.isEmpty()) {
        Node node = stack2.pop();
        visit(node);
    }
}

示例说明

假设有如下一棵二叉树:

    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语言实现非递归实现树的前中后序遍历总结 - Python技术站

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

相关文章

  • kotlin入门(18)利用单例对象获取时间

    以下是详细讲解“kotlin入门(18)利用单例对象获取时间的完整攻略”: kotlin入门(18)利用单例对象获取时间的完整攻略 在Kotlin中,可以使用单例对象来获取当前时间。本攻略将介绍如何使用单例对象获取时间。 步骤一:创建单例对象 首先需要创建一个单例对象,用于获取当前时间。可以按照以下步骤进行: 创建一个名为“Util”的Kotlin文件。 在…

    other 2023年5月10日
    00
  • windows开发记事本程序纪实(一)界面篇

    Windows开发记事本程序纪实(一)界面篇 界面设计 在这篇文章中,我将介绍如何使用C#语言开发Windows记事本程序的界面设计。 界面元素 记事本程序的界面主要由以下元素组成: 菜单栏 工具栏 状态栏 编辑区域 菜单栏和工具栏是记事本程序的主要功能区域,状态栏用于显示程序当前状态,编辑区域则是用户输入和显示文本的地方。 菜单栏设计 首先,我们需要设计记…

    other 2023年6月25日
    00
  • win10怎么进入安全模式 用bat命令行进安全模式方法

    下面是关于“win10怎么进入安全模式 用bat命令行进安全模式方法”的完整攻略: 进入安全模式的方法 方法一:通过系统配置工具 步骤如下: 按住Win+R键打开运行窗口,输入msconfig,按回车键打开系统配置工具。 在“引导”选项卡点击“安全启动”,勾选“最小化”和“网络”(如果需要网络支持),然后点击“应用”和“确定”按钮。 在下次重启时,系统将会自…

    other 2023年6月26日
    00
  • Linux系统日志分析的基本教程

    下面是针对“Linux系统日志分析的基本教程”的完整攻略: 第一步:准备工作 在开始分析日志之前,需要做一些基本的准备工作。我们需要安装和使用一些工具来协助我们完成日志分析。常用的工具包括: tail:用来实时监控日志文件的变化。 grep:用来过滤和匹配指定的字符串。 awk:用来处理文本文件,并提取出所需信息。 sed:用来按照指定的规则进行字符串替换或…

    other 2023年6月27日
    00
  • 从头学习C语言之指针和数组

    标题:从头学习C语言之指针和数组 什么是指针? 在C语言中,指针是一个非常重要的概念。指针可以理解为一个变量的地址,通过操作这个地址,我们可以操作这个变量。声明一个指针的方式为:类型 *指针变量名,其中类型是指针指向的数据类型,*用来表示指针类型,指针变量名则是自己取的一个名字。 以下是一个简单的示例: #include <stdio.h> in…

    other 2023年6月25日
    00
  • Redis在windows下安装与配置

    Redis是一款高性能的键值对存储数据库,常用于缓存、消息队列等场景。在Windows下安装和配置Redis相对于Linux来说稍微有些麻烦,但是也不是很难。下面是Redis在Windows下安装和配置的完整攻略。 安装Redis 下载Redis 在Redis官网下载页面(https://redis.io/download)下载最新的Redis稳定版,选择W…

    other 2023年5月5日
    00
  • Android编程实现系统重启与关机的方法

    Android编程实现系统重启与关机的方法 在Android应用程序开发中,有时候需要实现对设备进行重启与关机的操作。本文将介绍如何在Android设备上编程实现系统重启与关机的方法。 实现系统重启 Android系统中提供了PowerManager类,该类可以实现对设备的重启、关机等操作。 步骤 在AndroidManifest.xml文件中,添加以下权限…

    other 2023年6月27日
    00
  • python下pip的安装【get-pip】

    以下是关于“Python下pip的安装【get-pip】”的完整攻略,包括定义、方法、示例说明和注意事项。 定义 pip是Python的包管理工具,可以用于安装、升级和卸载Python包。在Python 2.7.9及以上版本和Python 3.4及以上版本中,pip已经默认安装。如果你的Python版本低于这些版本,或者你需要升级pip到最新版本,可以使用-…

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