C++二叉树的前序中序后序非递归实现方法详细讲解

C++二叉树的前序中序后序非递归实现方法详细讲解

二叉树是一种常见的树形数据结构,可以用于解决很多问题,在二叉树的遍历中,常见的有前序遍历、中序遍历和后序遍历。本文将详细讲解如何使用C++来实现二叉树的前序中序后序非递归遍历。

二叉树的遍历方式

  • 前序遍历:先输出根节点,再遍历左子树和右子树
  • 中序遍历:先遍历左子树,再输出根节点,最后遍历右子树
  • 后序遍历:先遍历左子树和右子树,最后输出根节点

二叉树的遍历的非递归实现

前序遍历

前序遍历的顺序是 根节点 -> 左子树 -> 右子树,因此,我们可以借助栈来实现非递归的前序遍历。

先将根节点入栈,然后进入循环,每次从栈中弹出一个节点,输出该节点,然后依次将其右子节点和左子节点入栈。直到栈为空,遍历结束。

以下展示一个实例:

void pre_order_traversal(BinaryTreeNode* root) {
    if (root == nullptr) {
        return;
    }
    std::stack<BinaryTreeNode*> node_stack;
    node_stack.push(root);
    while (!node_stack.empty()) {
        BinaryTreeNode* node = node_stack.top();
        node_stack.pop();
        std::cout << node->value << " "; // 输出节点的值
        if (node->right) {
            node_stack.push(node->right);
        }
        if (node->left) {
            node_stack.push(node->left);
        }
    }
}

中序遍历

中序遍历的顺序是 左子树 -> 根节点 -> 右子树,同样地,我们也可以借助栈来实现非递归的中序遍历。

首先我们将根节点入栈,然后进入循环,在每次循环中,如果栈顶元素不为空,我们就将其弹出,并输出节点的值,然后将其右子节点入栈,接着将其左子节点入栈。这样,在下一次循环时,会先输出节点的左子树和根节点,然后会输出节点的右子树。

以下展示一个实例:

void in_order_traversal(BinaryTreeNode* root) {
    std::stack<BinaryTreeNode*> node_stack;
    BinaryTreeNode* current = root;
    while (current || !node_stack.empty()) {
        while (current) {
            node_stack.push(current);
            current = current->left;
        }
        current = node_stack.top();
        node_stack.pop();
        std::cout << current->value << " "; // 输出节点的值
        current = current->right;
    }
}

后序遍历

后序遍历的顺序是 左子树 -> 右子树 -> 根节点,同样地,我们仍然可以借助栈来实现非递归的后序遍历。

我们可以使用两个栈,一个栈来存储节点,另一个栈来输出遍历的结果。将根节点压入第一个栈中,然后从第一个栈中弹出该节点,将其压入第二个栈中,然后依次将该节点的左子节点和右子节点压入第一个栈中。直到第一个栈为空,遍历结束。最后,从第二个栈中输出遍历的结果即可。

以下展示一个实例:

void post_order_traversal(BinaryTreeNode* root) {
    std::stack<BinaryTreeNode*> node_stack1;
    std::stack<BinaryTreeNode*> node_stack2;
    node_stack1.push(root);
    while (!node_stack1.empty()) {
        BinaryTreeNode* node = node_stack1.top();
        node_stack1.pop();
        node_stack2.push(node);
        if (node->left) {
            node_stack1.push(node->left);
        }
        if (node->right) {
            node_stack1.push(node->right);
        }
    }
    while (!node_stack2.empty()) {
        std::cout << node_stack2.top()->value << " ";
        node_stack2.pop();
    }
}

总结

C++二叉树的前序中序后序非递归实现方法,可以通过栈来实现,结合以上几个遍历方式的代码标准实现,我们可以更好的掌握二叉树的遍历,从而更好的应用于实际开发中。

阅读剩余 55%

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

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

相关文章

  • cad出现向程序发送命令时出现问题提示解决方法分享

    CAD出现向程序发送命令时出现问题提示解决方法分享 CAD是一个广泛使用的专业绘图软件,用于制作2D和3D图形。在使用CAD时,可能会遇到一个向程序发送命令时出现问题的错误提示,这会影响我们的工作效率和结果。本篇文章将分享如何解决这个问题。 问题表现 向程序发送命令时出现问题的错误提示可能会表现为以下几种情况: 在命令行中输入命令或点击工具栏的命令按钮时,C…

    其他 2023年3月28日
    00
  • SpringBoot获取配置文件内容的几种方式总结

    对于“SpringBoot获取配置文件内容的几种方式总结”,我会给出详细讲解,具体如下: 一、配置文件的基本概念 在 SpringBoot 中,配置文件有两种格式:.properties 和 .yml。 .properties 格式 这是一种基于 key=value 形式构成的配置文件,其中每一行用等号(=)分隔成两部分,左侧是键(key),右侧是值(val…

    other 2023年6月25日
    00
  • db2中substr用法

    当然,我可以为您提供详细的“db2中substr用法”的完整攻略,包括两个示例说明。 DB2中substr用法 在DB2中,substr函数用于字符串中提取子字符串。在本教程中,我们将介绍substr函数的用法和示例。 语法 substr函数语法如下: substr(string-expression, start, length) 其中,string-ex…

    other 2023年5月7日
    00
  • 如何解析json格式的字符串

    以下是解析JSON格式的字符串的完整攻略: 1. 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写。它基于JavaScript语言的一个子集,但是可以被多种编程语言使用。JSON格式的数据可以表示为键值对的集合,其中键和值之间用冒号分隔,键值对之间用逗号隔开,整个集合用花括号括起来。…

    other 2023年5月8日
    00
  • android实现系统分享

    当用户在Android应用程序中想要分享内容时,可以使用系统分享功能。系统分享功能允许用户将内容分享到其他应用程序中,例如社交媒体、电子邮件、信等。本文将详细讲解如何在Android应用程序中实现系统分享功能。 实现步骤 以下是实现系统分享功能的步骤: 创建一个Intent对象。 在Android中,Intent对象用于在应用程序之间传递数据。要创建一个分享…

    other 2023年5月9日
    00
  • 安装office 2010后桌面右键出现共享文件夹同步怎么去掉?

    要去掉桌面右键菜单中的共享文件夹同步选项,可以按照以下步骤进行操作: 打开注册表编辑器。按“Win + R”打开运行窗口,输入“regedit”后回车即可。 找到以下路径:“HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers”。 在这个路径下,可以看到多个子项,其中“Shari…

    other 2023年6月27日
    00
  • C语言算术运算符整理

    C语言算术运算符整理 简介 C语言提供了一组算术运算符,可以对数字进行基本的数学计算。通常使用算术运算符来编写算法,实现数学公式等。本文将介绍C语言中常见的算术运算符及其使用。 算术运算符 C语言提供了以下算术运算符: 运算符 名称 说明 + 加法 对两个数进行加法运算 – 减法 对两个数进行减法运算 * 乘法 对两个数进行乘法运算 / 除法 对两个数进行除…

    other 2023年6月27日
    00
  • 解决mybatis分页插件PageHelper导致自定义拦截器失效

    当使用MyBatis分页插件PageHelper时,可能会导致自定义拦截器失效的问题。下面是解决这个问题的攻略: 调整拦截器的执行顺序:PageHelper是一个拦截器,它会拦截并修改MyBatis的查询语句,以实现分页功能。如果您的自定义拦截器需要在PageHelper之后执行,您可以调整拦截器的执行顺序。在MyBatis的配置文件中,找到拦截器链的配置,…

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