(第22天)【leetcode题解】二叉树的迭代遍历

目录

  • 144、二叉树的前序遍历
    • 思路
    • 代码
  • 94、二叉树的中序遍历
    • 思路
    • 代码
  • 145、后序遍历
    • 思路
    • 代码
  • 总结

我们已经使用递归函数实现了二叉树的遍历。
递归函数实现的原理是每一次递归调用都会把函数的参数、局部变量、返回地址等压入调用栈中,然后递归返回时,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么会返回上一层位置的原因。
因此,在迭代实现二叉树遍历的过程中,我们可以使用栈来存储访问到的元素,并且辅助输出符合顺序的结果到结果集。

144、二叉树的前序遍历

思路

  • 前序遍历:中左右
  • 根据前序遍历的顺序,先将根节点压入栈中,将它的值加入结果集,然后弹出。
  • 之后不断遍历,每轮遍历都将右子节点和左子节点压入栈中,将栈顶元素(左子节点)的值加入结果集,然后弹出。直到将所有的左子节点值全部放入结果集。
  • 在之后便遍历中将之前存入栈中的右子节点值在依次加入结果集中。

代码

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> res;//结果集:存储顺序为前序遍历的顺序

        if (root == NULL) return res;
        st.push(root);

        while (!st.empty()) {
            TreeNode* node = st.top();//获得栈顶元素
            st.pop();//栈顶元素出栈
            res.push_back(node -> val);//把栈顶元素的节点值加到结果集
            if (node -> right) st.push(node -> right);//右节点入栈(为空时不入)
            if (node -> left) st.push(node -> left);//左节点入栈(为空时不入)
        }
        return res;
    }
};

94、二叉树的中序遍历

思路

  • 中序遍历:左中右
  • 根据中序遍历的顺序,我们需要先通过root访问到最底层的左节点,因此,初始化一个指针cur初始指向root
  • 使用curroot开始,向最底层的左子节点开始遍历,把遍历到的节点都压入栈中,cur指向空时截至。
  • 现在开始取出栈顶元素(将cur回退到栈顶元素),这时栈顶元素就是当前结果集需要的元素,把该元素值加入结果集,然后将cur指向当前节点的right节点。
  • cur指向空且栈中为空时,表明节点已经访问完且把所有节点值都按顺序加入结果集,循环截至。

代码

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> res;
        TreeNode* cur = root;//cur用来访问节点

        while (cur != NULL || !st.empty()) {
            if (cur != NULL) {//用cur访问节点,访问到最底层,把访问到的元素压入栈中
                st.push(cur);
                cur = cur -> left;//左
            } else {//从栈中取出当前最底层的元素加入结果集
                cur = st.top();//要处理的数据
                st.pop();
                res.push_back(cur -> val); //中
                cur = cur -> right; //右
            }
        }
        return res;
    }
};

145、后序遍历

思路

  • 后序遍历:左右中
  • 前序遍历的顺序为中左右,我们只需要修改前序遍历得出结果的代码,是的代码运行的结果为中右左
  • 这时,将这个结果翻转,就能得到后序遍历的结果。

代码

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;//临时存放遍历过的节点
        vector<int> res;//存放结果集
        if (root == NULL) return res;
        st.push(root);

        //得到结果为“中右左”的结果集
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            res.push_back(node -> val);
            if (node -> left) st.push(node -> left);
            if (node -> right) st.push(node -> right);
        }
        reverse(res.begin(), res.end());//翻转结果集:左右中

        return res;
    }
};

总结

  1. 前序遍历和中序遍历的不同
  • 前序遍历的顺序为中左右,在遍历访问节点的过程中就可以把元素值加入结果集;
  • 而中序遍历的顺序为左中右,需要先到达最底层的左子节点在开始将元素加入结果集。
  • 这决定了两种遍历方式在实现上的不同。
  1. 关于root节点为空的情况
  • 前序遍历和后序遍历实现时都需要先将root节点压入栈中,如果root为空时,在执行之后把root节点值加入res时就会报错。因此,在这两个实现中,需要先判断root是否为空。
  • 后序遍历因为要从root开始遍历整棵树,遍历的条件之一就是root不为空。因此,当root为空时,不会进入遍历树和填充结果集的逻辑,直接进行返回。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins部署成功后自动发通知到钉钉群

钉钉上如何配置 选择钉钉群&#xff0c;找到群设置-机器人-添加机器人 选择自定义 选择【添加】 选择【加签】&#xff0c;复制值&#xff0c;后续在jenkins里配置时会用到 复制Webhook地址&#xff0c;后面在jenkins里配置的时候要用到 Jenkins上如何配置 系统管理-插件管…

数学建模~~多目标规划

1.认识多目标规划 &#xff08;1&#xff09;前面我们介绍的是单目标规划&#xff0c;现在我们要认识一下多目标规划&#xff1a; &#xff08;2&#xff09;使用上面的这个题目作为例子&#xff0c;简单的翻译一下题干&#xff0c;这个题目说的就是 有1&#xff0c;2这两种产…

LeetCode题练习与总结:二叉树的最大深度--104

一、题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root […

Nginx/阿里云/二级域名的配置和使用

阿里云域名解析配置如下&#xff1a; nginx配置如下&#xff1a; 访问地址&#xff1a; zhadmin.iotzzh.com image.png

SD-WAN EVPN基本原理

SD-WAN EVPN是一种用于Overlay业务网络和底层传输网络分离以及业务网络路由和传输网络路由分离的VPN技术。SD-WAN EVPN技术采用类似于BGP/MPLS IP VPN的机制&#xff0c;通过扩展BGP协议&#xff0c;使用扩展后的可达性信息&#xff0c;使不同站点的底层传输网络互通&#xff0…

【NumPy】关于numpy.loadtxt()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

微服务如何做好监控

大家好&#xff0c;我是苍何。 在脉脉上看到这条帖子&#xff0c;说阿里 P8 因为上面 P9 斗争失败走人&#xff0c;以超龄 35 被裁&#xff0c;Boss 上找工作半年&#xff0c;到现在还处于失业中。 看了下沟通记录&#xff0c; 沟通了 1000 多次&#xff0c;但没有一个邀请投递…

MySQL-笔记-02.关系模型基本理论

目录 2.1 关系模型 2.1.1 基本概念 2.1.2 关系的完整性 1 实体完整性 2 参照完整性 3 用户定义完整性 2.2 关系代数 2.2.1 传统的集合运算 1 并运算 2 交运算 3 差运算 4 ​​笛卡尔积​编辑 2.2.2 专门的关系运算 1 选择 2 投影 3 连接 &#xff08;1&#xff09;等…

活动预告|来 GIAC 大会听大数据降本利器:AutoMQ 基于云原生重新设计的 Kafka

GIAC大会 2024年5月24日至25日&#xff0c;2024 全球互联网架构大会&#xff08;简称&#xff1a;GIAC大会&#xff09;将于深圳华侨城洲际酒店举行。大会将聚焦互联网架构热门的 AIGC、效能提升、 云原生架构、数据智能、新硬件等领域&#xff0c;甄选前沿的有典型代表性的技…

“手撕”String类+练习题

目录 一、什么是String类 二、String类的使用 三、String类的字符串操作 String对象的比较 字符串的查找 字符串的转换 字符串的替换 字符串的拆分 字符串的截取 大小写和去空格方法 四、字符串的不可变性 五、字符串的修改 六、StringBuilder类和StringBuffer类…

正确可用--Notepad++批量转换文件编码为UTF8

参考了:Notepad批量转换文件编码为UTF8_怎么批量把ansi转成utf8-CSDN博客​​​​​​https://blog.csdn.net/wangmy1988/article/details/118698647我参考了它的教程,但是py脚本写的不对. 只能改一个.不能实现批量更改. 他的操作步骤没问题,就是把脚本代码换成我这个. #-*-…

解锁创意新境界:StartAI插件让Photoshop飞起来!

Photoshop AI插件的革命性突破&#xff1a;StartAI插件的全面体验 作为一名AIGC测评博主&#xff0c;我一直在寻找能够提升设计效率和创意表现的工具。今天&#xff0c;我将带大家深入了解一款令人兴奋的Photoshop AI插件——StartAI&#xff0c;它不仅为设计师带来了前所未有…

新零售数据中台:构建零售业高效率、智能化的数据处理平台_光点科技

随着互联网技术的快速发展和移动支付、大数据等技术的广泛应用&#xff0c;零售行业已经逐渐从传统零售向新零售模式转变。在这个变革的时代背景下&#xff0c;新零售数据中台应运而生&#xff0c;它作为零售行业数据资源的整合与智能分析的核心载体&#xff0c;成为推动零售行…

C语言-----数据存储

# define _CRT_SECURE_NO_WARNINGS # include<stdio.h>int main(void) {char a -1;signed char b -1;unsigned char c -1;printf("a%d,b%d,c%d", a, b, c); //a-1,b-1,c255 }

Google发布的CAT3D,在1分钟内,能够从任意数量的真实或生成的图像创建3D场景。

给定任意数量的输入图像&#xff0c;使用以这些图像为条件的多视图扩散模型来生成场景的新视图。生成的视图被输入到强大的 3D 重建管道&#xff0c;生成可以交互渲染的 3D 表示。总处理时间&#xff08;包括视图生成和 3D 重建&#xff09;仅需一分钟。 相关链接 论文&#x…

Redis主从、哨兵、集群讲解

一、Redis主从 大家在面试中可能经常会被问到Redis的高可用问题。Redis高可用回答包括两个层面&#xff0c;一个就是数据不能丢失&#xff0c;或者说尽量减少丢失 ;另外一个就是保证Redis服务不中断 。 对于尽量减少数据丢失&#xff0c;可以通过AOF和RDB保证。 对于保证服务…

ROS | 用C++和python实现运动控制功能

基础知识&#xff1a; 用C实现&#xff1a; C代码&#xff1a; 用python实现&#xff1a; Python代码&#xff1a;

Git学习和使用指南详细篇

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【源码】二开版发卡自助下单授权DU系统/发卡秒u系统//完整总代理+子代理系统/支付模板全部优化授权

测试环境&#xff1a;宝塔、Linux系统、PHP7.4、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态thinkPHP&#xff0c;开启SSL 和前面发的那一套不一样哈&#xff0c;这套是新的后端&#xff0c;然后用了前面那一套的前端支付授权模板&#xff0c;总之改了很多东西&#…

逻辑漏洞靶场通关

会员中心注册新用户test&#xff0c;密码123123 会员中心注册新用户name&#xff0c;密码abcabc 管理员账号admin&#xff0c;密码123456 1.普通账号间水平越权漏洞测试 一个网站登录普通账号test后修改信息时进行抓包 在重发器中修改普通账号test为普通账号name&#xff0c;并…