C++——二叉树的前序遍历||中序遍历||后序遍历 非递归算法

news2024/11/14 3:20:34

目录

  • 二叉树的前序遍历,非递归迭代实现
  • 二叉树的中序遍历 ,非递归迭代实现
  • 二叉树的后序遍历 ,非递归迭代实现

二叉树的前序遍历,非递归迭代实现

题目链接
思路:
将任何一颗树分成两个部分,一部分是左路节点(3、5、6),另一部分左路节点的若干个右子树(2、7、4、1、0、8)。
先将左路结点入栈,因为是前序遍历,入一个结点,就访问一个结点,然后从栈顶开始判断这个结点是否有右子树,没有右子树就只将其从栈中pop掉,
有右子树的话先把这个结点记录一下,然后从栈中pop掉,然后再去这个结点的右子树找,把这个结点的右子树也划分为左路结点和左路结点的右子树,循环前面的过程。
在这里插入图片描述
代码:

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> v;//存二叉树的数据
        stack<TreeNode*> s;//遍历二叉树的容器

        TreeNode*cur=root;
        while(cur||!s.empty())//当栈不为空或者cur不为空时循环才会继续
        //有可能一上来s是空的,此时就要拿cur来判断
        {
            //开始访问一棵树
            while(cur)
            {
                v.push_back(cur->val);//前序遍历就要先存数据
                //把左路结点依次入栈
                s.push(cur);
                cur=cur->left;
            }

            //第一次栈顶是最左下方的结点,接下来访问左路结点的右子树
            cur=s.top()->right;
            //这个结点已经用v记录了,出栈
            s.pop();
        }
        return v;
    }
};

二叉树的中序遍历 ,非递归迭代实现

题目链接
思路:
和前序遍历的思路差不多,就是要先把左路结点入栈,然后再访问根结点,然后再去根的右子树,把访问过的根出栈。再把右子树的左路结点入栈…,就这样循环往复,直到栈里没有元素为止。
代码:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> v;
        stack<TreeNode*> s;

        TreeNode*cur=root;
        while(cur||!s.empty())
        {
            
            while(cur)
            {
                s.push(cur);
                cur=cur->left;
            }

            v.push_back(s.top()->val);

            cur=s.top()->right;
            s.pop();

        }

        return v;
    }
};

二叉树的后序遍历 ,非递归迭代实现

题目链接
在这里插入图片描述
思路:

大思路和前序中序的一样,就是将一棵树的左路结点(3、5、6)先入栈,因为是后序遍历,要后访问根。
与前序和中序不一样的是:要在push_back到v的时候,s即将被pop的之前,记录一下这个结点的地址before_root,方便确定是否一个根的右子树是否已经被访问了,如果被访问了,那么才可以访问根自己。
模拟一下过程:
从小问题开始转化,从此时的栈顶6开始,如果6的右子树为空,那么才可以访问6。然后出栈。接着栈顶此时是5,看5的右子树不为空,看看before_root上一个访问的地址是谁,很显然上一次访问的是6,5的右子树没有访问,那么把右子树的左路再入栈。再划分成一个个子问题。
如果before_root记录的时候2的地址,好,那么说明5的右子树已经被访问,这时才能访问5自己。
代码:

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> v;
        stack<TreeNode*> s;

        TreeNode*cur=root;
        TreeNode*before_root=nullptr;//记录前一个结点的变量
        while(cur||!s.empty())
        {
            
            while(cur)
            {
                
                s.push(cur);
                cur=cur->left;
            }

            
            if(s.top()->right==nullptr||before_root==s.top()->right)
            //右子树为空或者右子树已经被访问过了才能访问自己
            {
                v.push_back(s.top()->val);
                before_root=s.top();//记录一下这个节点的地址
                s.pop();
            }
            else//右子树不为空且没有被访问,要去右子树中将左路结点入栈
            {
                cur=s.top()->right;
            }

        }

        return v;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/355523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Three.js搭建的一个艺术场景

本文翻译自于Medium&#xff0c;原作者用 Three.js 创建了一个“Synthwave 场景”&#xff0c;效果还不错&#xff0c;在此加上自己的理解&#xff0c;记录一下。在线Demo. 地形构建 作者想要搭建一个中间平坦、两侧有凹凸山脉效果并且能够一直绵延不断的地形&#xff0c;接下…

Quartz组件任务调度管理

Quartz什么是Quartzquartz:石英钟的意思是一个当今市面上流行的高效的任务调度管理工具所谓"调度"就是制定好的什么时间做什么事情的计划由OpenSymphony开源组织开发Symphony:交响乐是java编写的,我们使用时需要导入依赖即可为什么需要Quartz所谓"调度"就是…

18:CTK 总结篇(FAQ)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 经过了几个月的艰苦奋战,终于到了最后一节啦,是不是和我一样,心里有点儿小激动! 回顾之前的章节,从初级 -> 进阶 -> 高级,我们针对 CTK 做了详细的分类讲解。希望通过这些知识,大家能对模块化…

管理会计报告和财务报告的区别

财务会计报告是给投资人看的&#xff0c;可以反映公司总体的盈利能力。不过&#xff0c;我们回顾一下前面“第一天”里面提到的问题。如果你是公司的产品经理&#xff0c;目前有三个产品在你的管辖范围内。上级给你一笔新的资金&#xff0c;这笔资金应该投到哪个产品上&#xf…

c++容器

1、vector容器 1.1性质 a&#xff09;该容器的数据结构和数组相似&#xff0c;被称为单端数组。 b&#xff09;在存储数据时不是在原有空间上往后拓展&#xff0c;而是找到一个新的空间&#xff0c;将原数据深拷贝到新空间&#xff0c;释放原空间。该过程被称为动态拓展。 vec…

什么是猜疑心理?小猫测试网科普小作文

什么是猜疑心理&#xff1f;猜疑心理是说一个人心中想法偏离了客观事实&#xff0c;牵强附会&#xff0c;往往是指不好的一面&#xff0c;对别人的一言一行都充满了不良的解读&#xff0c;认为这些对自己都有针对性&#xff0c;目的性&#xff0c;对自己都是不利的。猜疑心理重…

算力引领 数“聚”韶关——第二届中国韶关大数据创新创业大赛圆满收官

为进一步促进数字经济领域创新创业发展&#xff0c;推动国家数据中心集群建设&#xff0c;构建大数据领域资源专业平台&#xff0c;促进大湾区大数据科技成果和创新创业人才转化落地&#xff0c;为韶关大数据领域创新型产业集群的打造、大数据科技成果和创新创业人才的转化落地…

如何选择合适的固态继电器?

如何选择合适的固态继电器&#xff1f; 在选择固态继电器&#xff08;SSR&#xff09;时&#xff0c;应根据实际应用条件和SSR性能参数&#xff0c;特别要考虑到使用中的过流和过压条件以及SSR的负载能力&#xff0c;这有助于实现固态继电器的长寿命和高可靠性。然后&#xff0…

九龙证券|最新评级情况出炉,机构扎堆这一板块!聚氨酯龙头获得最多关注

本周算计254家上市公司获组织“买入型”评级。 电子板块评级组织扎堆 证券时报数据宝计算&#xff0c;2月13日至17日&#xff0c;A股市场53家组织算计进行347次评级&#xff0c;254家上市公司获“买入型”评级&#xff08;包含买入、增持、强烈推荐、推荐&#xff09;。 从申…

ONNX yolov5导出 convert error --grid

使用的版本 https://github.com/ultralytics/yolov5/tree/v5.0 安装onnx torch.onnx.export(model, img, f, verboseFalse, opset_version12, input_names[images],output_names[classes, boxes] if y is None else [output],dynamic_axes{images: {0: batch, 2: height, 3:…

智慧校园:校务助手微信小程序端源码

校园校务助手-智慧校园教师移动端校园校务助手微信小程序端也指智慧校园教师端微信小程序 它包括哪些功能呢&#xff1f;我来介绍一下。 智慧校园教师端微信小程序是基于原生开发 教师端登录界面①.设备管理、通知管理、图片管理、班级考勤 ②.综合素质评价、视频管理、请假…

SQL Server 2008新特性——更改跟踪

在大型的数据库应用中&#xff0c;经常会遇到部分数据的脱机和多个数据库的合并问题。比如现在有一个全省范围使用的应用程序&#xff0c;每个市都部署了单独的相同的应用程序服务器和数据库服务器&#xff0c;每个月需要将全省所有市的数据全部汇总起来用于出全省的报表&#…

微搭使用笔记(三) 数据模型介绍及初步使用

基于数据模型实现表单页面的生成和数据的保存、查看 表单应用是微搭的一个重要的使用场景&#xff0c;我们举下面一个简单的问卷调查的例子: 基于以上问卷&#xff0c;本文我们采取数据模型的方式生成表单页面并完成数据的保存及查看。 数据模型概述 先看下官方文档对于数据…

使用 TypeScript 的 CheckJS 为你的陈旧 JavaScript 项目续命

&#x1f64b; Why CheckJS? 让 JavaScript 项目也能享受到 TS 的类型推导等诸多好处。* 和直迁 TypeScript 相比&#xff0c;大大降低成本和风险&#xff0c;例如&#xff1a;&#x1f6a5; 使用方法 安装依赖、追加配置 # 为你的项目安装 TypeScript npm install typescri…

冰蝎4.0特征分析及流量检测思路

0 1、 冰蝎4.0介绍 冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端。老牌Webshell管理神器——中国菜刀的攻击流量特征明显&#xff0c;容易被各类安全设备检测&#xff0c;实际场景中越来越少使用&#xff0c;加密 Webshell 正变得日趋流行。 由于通信流量被…

JAVA时间类及JAVA8新时间类

文章目录Java旧时间类关系图![在这里插入图片描述](https://img-blog.csdnimg.cn/e2c2c26c841e40bdb9cc85d0fc4bc1df.png)GMT、时间戳、统一标准时间、时区Java时间类创建时间类示例java.text.DateFormat时间格式转换java.util.Calendar总结Java时间类Java8新时间类InstantCloc…

Vulnhub-DC-2实战靶场

Vulnhub-DC-2实战靶场 https://blog.csdn.net/ierciyuan/article/details/127560871 这次试试DC-2&#xff0c;目标是找到官方设置的5个flag。 一. 环境搭建 1. 准备工具 虚拟机Kali&#xff1a; 自备&#xff0c;我的kali的IP为192.168.3.129 靶场机&#xff1a; https…

接口和抽象类

接口(Interface)和抽象类(Abstract Class)是支持抽象类定义的两种机制。 1.抽象类 (1)说明 在Java中被abstract关键字修饰的类称为抽象类&#xff0c;被abstract关键字修饰的方法称为抽象方法&#xff0c;抽象方法只有方法的声明&#xff0c;没有方法体。抽象类是用来捕捉子…

CCNP350-401学习笔记(151-200题)

151、Which two LISP infrastructure elements are needed to support LISP to non-LISP internetworking? (Choose two.)A. PETR B. PITRC. MR D. MS E. ALT 152、In an SD-WAN deployment, which action in the vSmart controller responsible for? A. handle, maintain, …

一文搞懂C/C++内存管理原理与实现

C 语言内存管理指对系统内存的分配、创建、使用这一系列操作。在内存管理中&#xff0c;由于是操作系统内存&#xff0c;使用不当会造成毕竟麻烦的结果。本文将从系统内存的分配、创建出发&#xff0c;并且使用例子来举例说明内存管理不当会出现的情况及解决办法。 一、内存 …