java非递归实现之二叉树的前中后序遍历详解

Java非递归实现之二叉树的前中后序遍历详解

1、概述

在程序设计中,二叉树是一种常用的数据结构,而对二叉树进行遍历则是非常基础和重要的操作。二叉树的遍历分为三种:前序遍历、中序遍历和后序遍历。

常规的二叉树遍历算法使用递归完成,但是递归算法的效率比较低,同时深度过深还会导致调用栈溢出,因此我们可以采用非递归的方式来实现二叉树的遍历。

本文将通过Java代码,详细说明如何使用非递归的方式来实现二叉树的前、中、后序遍历。

2、前序遍历实现

前序遍历的顺序是:根节点、左子树、右子树。下面是非递归实现的前序遍历方法。

/**
 * 非递归前序遍历
 * @param root 二叉树的根节点
 */
public void preOrderTraversal(TreeNode root) {
    if (root == null) return;
    Stack<TreeNode> stack = new Stack<>();
    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);
    }
}

我们使用栈来模拟递归的过程,但是和递归不同的是,在入栈的时候,先将右子树入栈,然后再将左子树入栈,这是因为节点出栈的顺序是先左子树,然后右子树,最后根节点,使用这样的顺序保证了节点出栈的顺序符合前序遍历的规则。

例如,对于下面的二叉树:

         1
        / \
       2   3
      / \   \
     4   5   6

我们非递归前序遍历的结果是:1 2 4 5 3 6

3、中序遍历实现

中序遍历的顺序是:左子树、根节点、右子树。下面是非递归实现的中序遍历方法。

/**
 * 非递归中序遍历
 * @param root 二叉树的根节点
 */
public void inOrderTraversal(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode cur = root;
    while (cur != null || !stack.isEmpty()) {
        while (cur != null) {
            stack.push(cur);
            cur = cur.left;
        }
        TreeNode node = stack.pop();
        System.out.print(node.val + " ");
        cur = node.right;
    }
}

我们使用栈来模拟递归的过程,首先将根节点入栈,然后将当前节点设置为左子树,直到没有左子树了,此时节点出栈,然后将当前节点设置为右子树,再开始新一轮的遍历。

例如,对于下面的二叉树:

         1
        / \
       2   3
      / \   \
     4   5   6

我们非递归中序遍历的结果是:4 2 5 1 3 6

4、后序遍历实现

后序遍历的顺序是:左子树、右子树、根节点。下面是非递归实现的后序遍历方法。

/**
 * 非递归后序遍历
 * @param root 二叉树的根节点
 */
public void postOrderTraversal(TreeNode root) {
    if (root == null) return;
    Stack<TreeNode> stack1 = new Stack<>();
    Stack<TreeNode> stack2 = new Stack<>();
    stack1.push(root);
    while (!stack1.isEmpty()) {
        TreeNode 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()) {
        TreeNode node = stack2.pop();
        System.out.print(node.val + " ");
    }
}

我们使用两个栈来实现后序遍历,首先将根节点入栈1,然后将节点依次出栈放入栈2,同时将左右子树入栈1,当栈1为空时,栈2中的节点就是按照后序遍历的顺序排列的。

例如,对于下面的二叉树:

         1
        / \
       2   3
      / \   \
     4   5   6

我们非递归后续遍历的结果是:4 5 2 6 3 1

5、总结

使用非递归的方式实现二叉树的遍历操作,可以避免递归带来的调用栈过深的问题,提高算法的效率。本文介绍了使用Java代码实现二叉树的前序、中序、后序遍历的非递归方法,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java非递归实现之二叉树的前中后序遍历详解 - Python技术站

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

相关文章

  • C语言例题讲解指针与数组

    C语言例题讲解指针与数组 本文将通过两个实例,详细讲解指针与数组在C语言中的应用。 实例一:指针与数组的使用 在C语言中,可以通过指针来操作数组,以下是一个简单的示例。 #include <stdio.h> int main() { int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; // 指针指向数组的首地址…

    other 2023年6月25日
    00
  • Swift继承Inheritance浅析介绍

    Swift继承Inheritance浅析介绍 什么是继承? 在Swift中,继承是一种实现代码重用的方法。子类可以继承父类的属性和方法,并且可以在此基础上添加自己的属性和方法。 如何定义一个继承关系? 在Swift中,通过在子类的类名后面加上父类的类名,来定义一个继承关系。下面是一个例子: class Person { var name: String va…

    other 2023年6月26日
    00
  • js手机号码简单正则校验

    js手机号码简单正则校验 在网页开发中,我们常常需要对用户输入进行校验,以保证数据的合法性和正确性。手机号码是我们常常需要验证的一个输入项,本文将介绍如何使用Javascript实现手机号码的简单正则校验。 1. 正则表达式 正则表达式是一种用来匹配字符串的模式,它由一些特定的字符和元字符组成。在进行手机号码校验时,我们需要用到以下正则表达式: /^1[34…

    其他 2023年3月28日
    00
  • oracle数据库io异常 错误代码17002解决办法

    Oracle数据库IO异常 错误代码17002解决办法 在使用Oracle数据库时,有时候可能会遇到IO异常的问题,错误代码为17002。这个错误一般是由于网络传输过程中发生错误导致的,可能是由于网络连接不稳定或服务器负荷过大等原因引起的。本文将介绍如何解决这个问题。 1. 检查网络连接和服务器负荷 在遇到这个问题时,首先需要检查一下网络连接和服务器负荷。可…

    其他 2023年3月28日
    00
  • Java反射之静态加载和动态加载的简单实例

    下面是详细的攻略: Java反射之静态加载和动态加载的简单实例 什么是Java反射 Java反射是指在运行时动态获取一个类的信息,并动态调用它的方法、构造函数等的能力。Java反射机制提供了一种动态加载类和访问类的方式,能够增强程序的灵活性和扩展性。 反射的基本概念 Class类:Java反射机制的核心类,所有的类在载入时都会生成一个Class类的实例。 C…

    other 2023年6月25日
    00
  • axure怎么制作下拉多选部门的控件?

    当您在Axure中创建一个下拉多选的控件时,需要遵循以下步骤: 1. 添加下拉框组件 首先,选择下拉框控件并将其放置在页面上。你可以在“部件”库中找到下拉框控件。另外,你需要设置一个宽度适当的下拉菜单。 2. 设置下拉框组件的交互 接下来,你需要为下拉框添加互动事件。右键单击下拉框部件并选择“互动”选项。这个步骤会打开一个弹出式菜单界面。在此界面中,你需要为…

    other 2023年6月26日
    00
  • cpa是什么证书?

    CPA证书是Certified Public Accountant的缩写,翻译为注册会计师,是美国最高级别的会计师资格证书。获得CPA证书需要在美国的各个州通过相应的考试,并满足相关的教育和工作经验要求。 以下是获得CPA证书的大致过程: 1.满足教育和工作经验要求:在大多数州,获得CPA证书需要拥有一定程度的学历和工作经验。具体要求因州而异,但通常需要拥有…

    其他 2023年4月16日
    00
  • Win10预览版9860自制ISO镜像下载

    Win10预览版9860自制ISO镜像下载攻略 本攻略将详细介绍如何下载Win10预览版9860的自制ISO镜像。请按照以下步骤进行操作: 步骤一:准备工作 在开始之前,请确保您已经完成以下准备工作: 确保您的计算机已经安装了合适的操作系统和软件,以便进行下载和制作ISO镜像。 确保您的计算机已经连接到互联网,并且网络连接稳定。 步骤二:查找可靠的下载源 在…

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