C++ 非递归实现二叉树的前中后序遍历

对于C++非递归实现二叉树的前中后序遍历,可以分为以下步骤:

1. 前置知识

在进行二叉树的非递归遍历前,我们需要了解以下几个数据结构:

  • 栈:用于存储遍历过程中需要回溯的节点。
  • 二叉树节点的结构体:包括指向左右子树的指针以及节点的值。

2. 前序遍历

前序遍历的顺序是先遍历节点,再遍历左子树,最后遍历右子树。非递归实现的思路是:

  1. 先将根节点压入栈中。
  2. 循环进行以下操作:
  3. 取出栈顶节点,并访问它。
  4. 如果节点有右子树,将右子树压入栈中。
  5. 如果节点有左子树,将左子树压入栈中。

下面是一个示例代码:

vector<int> preorderTraversal(TreeNode* root) {
    vector<int> res; // 存放结果的向量
    stack<TreeNode*> stk; // 存放遍历需要回溯的节点的栈
    if (root) stk.push(root); // 如果根节点不为空,则将根节点压入栈中
    while (!stk.empty()) {
        TreeNode* node = stk.top(); // 取出栈顶节点并访问
        res.push_back(node->val); 
        stk.pop(); 
        if (node->right) stk.push(node->right); // 若有右子树,将右子树压入栈中
        if (node->left) stk.push(node->left); // 若有左子树,将左子树压入栈中
    }
    return res; // 返回遍历的结果向量
}

3. 中序遍历

中序遍历的顺序是先遍历左子树,再遍历节点,最后遍历右子树。非递归实现的思路是:

  1. 从根节点开始,将左子树压入栈中。
  2. 循环进行以下操作:
  3. 取出栈顶节点,并访问它。
  4. 如果该节点有右子树,将右子树压入栈中。

下面是一个示例代码:

vector<int> inorderTraversal(TreeNode* root) {
    vector<int> res; // 存放结果的向量
    stack<TreeNode*> stk; // 存放遍历需要回溯的节点的栈
    TreeNode* cur = root; // 从根节点开始
    while (cur || !stk.empty()) { 
        // 若当前节点不为空或栈不为空,进入循环
        while (cur) { 
            stk.push(cur); // 将当前节点压入栈中
            cur = cur->left; // 继续访问当前节点的左子树
        }
        cur = stk.top(); 
        stk.pop(); 
        res.push_back(cur->val); 
        cur = cur->right; // 访问右子树
    }
    return res; // 返回遍历的结果向量
}

4. 后序遍历

后序遍历的顺序是先遍历左子树,再遍历右子树,最后遍历节点。非递归实现的思路是:

  1. 执行类似前序遍历的操作,但是访问节点时不立即将节点的值输出,而是将它压入另一个栈中。
  2. 在遍历完毕后,从该栈中依次取出节点,输出节点的值即可。

下面是一个示例代码:

vector<int> postorderTraversal(TreeNode* root) {
    vector<int> res; // 存放结果的向量
    stack<TreeNode*> stk; // 存放遍历需要回溯的节点的栈
    stack<int> output; // 存放输出节点值的栈
    if (root) stk.push(root); 
    while (!stk.empty()) {
        TreeNode* node = stk.top(); 
        stk.pop(); 
        output.push(node->val); 
        if (node->left) stk.push(node->left); 
        if (node->right) stk.push(node->right); 
    }
    while (!output.empty()) {
        res.push_back(output.top()); 
        output.pop(); 
    }
    return res; // 返回遍历的结果向量
}

希望以上的解释能够帮到您,如果还有任何问题或疑问,欢迎继续咨询。

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

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

相关文章

  • 电脑内存故障修复大全

    电脑内存故障修复大全 1. 检查内存硬件 首先,我们需要检查内存硬件是否存在故障。以下是一些常见的方法: 重新插拔内存条:将内存条从插槽中取出,然后重新插入确保它们正确连接。 更换内存插槽:如果重新插拔内存条没有解决问题,尝试将内存条插入不同的插槽,以排除插槽故障的可能性。 清洁内存插槽:使用压缩气罐或棉签轻轻清洁内存插槽,以去除可能存在的灰尘或污垢。 2.…

    other 2023年8月1日
    00
  • Access窗体怎么创建组合框及列表框控件?

    创建Access窗体时,可以通过添加组合框和列表框控件来提供更好的用户体验。下面是创建这些控件的完整攻略。 创建组合框控件 在Access窗体设计器中,选择“设计”视图。 从工具箱中选择“组合框”控件并将其拖到你的窗体中。 右击组合框控件,选择“属性”窗口。 在“数据”选项卡中,选择你想要提供选项的表或查询。 在“格式”选项卡中,选择你想要显示的字段。 指定…

    other 2023年6月27日
    00
  • Vue封装全局过滤器Filters的步骤

    下面是Vue封装全局过滤器Filters的步骤的详细讲解。 步骤一:在Vue中定义全局过滤器 在Vue中定义全局过滤器的操作比较简单,我们只需要在Vue实例的filters属性中定义一个函数,然后在模板中使用{{ 表达式 | 过滤器名 }}的方式进行调用。 示例一 下面是一个将数字金额转换为万元的全局过滤器的例子: Vue.filter(‘toWanYuan…

    other 2023年6月25日
    00
  • C++ 初始化列表详解及实例代码

    C++ 初始化列表详解及实例代码 在 C++ 中,当我们定义一个类或结构体时,我们可以使用初始化列表来初始化类或结构体的成员变量。初始化列表提供了一种高效的方式来初始化类或结构体成员变量,特别是在初始化对性能要求很高的类时。 什么是初始化列表 初始化列表是一种用于初始化类或结构体成员变量的语法结构。通过初始化列表,我们可以在构造函数中以一种简洁和高效的方式初…

    other 2023年6月20日
    00
  • vue3实战-axios请求封装问题(get、post、put、delete)

    下面是“vue3实战-axios请求封装问题(get、post、put、delete)”的完整攻略。 为什么需要封装请求 在vue3开发过程中,经常需要通过API接口请求数据并渲染到页面上。但是每次都使用axios发起请求会导致代码冗余度高,可维护性低等问题。因此,我们需要对axios进行封装,以提高代码质量和可维护性。 封装过程详解 首先,在src目录下创…

    other 2023年6月25日
    00
  • Python递归调用实现数字累加的代码

    Python递归调用可以使用较少的代码实现一些复杂的算法,其中一个简单的例子就是使用递归调用实现数字累加。 代码实现 def sum_n(n): if n == 1: return 1 else: return n + sum_n(n-1) 以上代码分为两部分: 第一部分是函数定义,其中 def 关键字表示定义函数,sum_n 表示函数名称。参数 n 是传递…

    other 2023年6月27日
    00
  • collection转为list

    以下是关于将collection转为list的完整攻略: 转换collection为list 在Java中,可以使用java.util.Collection接口的toArray()方法将collection转换为数组,然后使用java.util.Arrays类的asList()方法将数组转换为list。另外,也可以使用Java 8中的java.util.st…

    other 2023年5月6日
    00
  • SpringBoot跨域问题的五种解决方式

    当使用SpringBoot开发Web应用时,跨域问题是很常见的。本文将介绍五种常见的解决方式: 1. 使用@CrossOrigin注解 在Controller层的方法上添加@CrossOrigin注解,表示允许跨域请求。例如: @RestController public class MyController { @GetMapping("/hel…

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