6-4 二叉树的非递归遍历 (25分)_本周小结!(二叉树)

8c2680e697e45719b36e483b934240e7.gif给「代码随想录」一个星标吧!

以后每周加上一个本周小结怎么样?

本周小结

发现大家周末的时候貌似都不在学习状态,周末的文章浏览量和打卡情况照工作日差很多呀,可能是本周日是工作日了,周六得好好放松放松,哈哈,理解理解,但我还不能不更啊,还有同学要看呢。

所以呢,「周日我做一个针对本周的打卡留言疑问以及在刷题群里的讨论内容做一下梳理吧。」,这样也有助于大家补一补本周的内容,消化消化。

「注意这个周末总结和系列总结还是不一样的(二叉树还远没有结束),这个总结是针对留言疑问以及刷题群里讨论内容的归纳。」

周一

本周我们开始讲解了二叉树,在关于二叉树,你该了解这些!中讲解了二叉树的理论基础。

有同学会把红黑树和二叉平衡搜索树弄分开了,其实红黑树就是一种二叉平衡搜索树,这两个树不是独立的,所以C++中map、multimap、set、multiset的底层实现机制是二叉平衡搜索树,再具体一点是红黑树。

对于二叉树节点的定义,C++代码如下:

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

对于这个定义中TreeNode(int x) : val(x), left(NULL), right(NULL) {} 有同学不清楚干什么的。

这是构造函数,这么说吧C语言中的结构体是C++中类的祖先,所以C++结构体也可以有构造函数。

构造函数也可以不写,但是new一个新的节点的时候就比较麻烦。

例如有构造函数,定义初始值为9的节点:

TreeNode* a = new TreeNode(9);

没有构造函数的话就要这么写:

TreeNode* a = new TreeNode(); 
a->val = 9; 
a->left = NULL;
a->right = NULL;  

在介绍前中后序遍历的时候,有递归和迭代(非递归),还有一种牛逼的遍历方式:morris遍历。

morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以将非递归遍历中的空间复杂度降为O(1),感兴趣大家就去查一查学习学习,比较小众,面试几乎不会考。我其实也没有研究过,就不做过多介绍了。

周二

在二叉树:一入递归深似海,从此offer是路人中讲到了递归三要素,以及前中后序的递归写法。

文章中我给出了leetcode上三道二叉树的前中后序题目,但是看完二叉树:一入递归深似海,从此offer是路人,依然可以解决n叉树的前后序遍历,在leetcode上分别是

  • 589 . N叉树的前序遍历
  • 590 . N叉树的后序遍历

大家可以再去把这两道题目做了。

周三

在二叉树:听说递归能做的,栈也能做!中我们开始用栈来实现递归的写法,也就是所谓的迭代法。

细心的同学发现文中前后序遍历空节点是入栈的,其实空节点入不入栈都差不多,但感觉空节点不入栈确实清晰一些,符合文中动画的演示。

前序遍历空节点不入栈的代码:(注意注释部分,和文章中的区别)

class Solution {
public:
    vector preorderTraversal(TreeNode* root) {
        stack st;
        vector result;if (root == NULL) return result;
        st.push(root);while (!st.empty()) {
            TreeNode* node = st.top();                       // 中
            st.pop();
            result.push_back(node->val);if (node->right) st.push(node->right);           // 右(空节点不入栈)if (node->left) st.push(node->left);             // 左(空节点不入栈)
        }return result;
    }
};

后序遍历空节点不入栈的代码:(注意注释部分,和文章中的区别)

class Solution {
public:
    vector postorderTraversal(TreeNode* root) {
        stack st;
        vector result;if (root == NULL) return result;
        st.push(root);while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            result.push_back(node->val);if (node->left) st.push(node->left); // 相对于前序遍历,这更改一下入栈顺序 (空节点不入栈)if (node->right) st.push(node->right); // 空节点不入栈
        }
        reverse(result.begin(), result.end()); // 将结果反转之后就是左右中的顺序了return result;
    }
};

在实现迭代法的过程中,有同学问了:递归与迭代究竟谁优谁劣呢?

从时间复杂度上其实迭代法和递归法差不多(在不考虑函数调用开销和函数调用产生的堆栈开销),但是空间复杂度上,递归开销会大一些,因为递归需要系统堆栈存参数返回值等等。

递归更容易让程序员理解,但收敛不好,容易栈溢出。

这么说吧,递归是方便了程序员,难为了机器(各种保存参数,各种进栈出栈)。

「在实际项目开发的过程中我们是要尽量避免递归!因为项目代码参数、调用关系都比较复杂,不容易控制递归深度,甚至会栈溢出。」

周四

在二叉树:前中后序迭代方式的写法就不能统一一下么?中我们使用空节点作为标记,给出了统一的前中后序迭代法。

此时又多了一种前中后序的迭代写法,那么有同学问了:前中后序迭代法是不是一定要统一来写,这样才算是规范。

其实没必要,还是自己感觉哪一种更好记就用哪种。

但是「一定要掌握前中后序一种迭代的写法,并不因为某种场景的题目一定要用迭代,而是现场面试的时候,面试官看你顺畅的写出了递归,一般会进一步考察能不能写出相应的迭代。」

周五

在二叉树:层序遍历登场!中我们介绍了二叉树的另一种遍历方式(图论中广度优先搜索在二叉树上的应用)即:层序遍历。

看完这篇文章,去leetcode上怒刷五题,文章中 编号107题目的样例图放错了(原谅我匆忙之间总是手抖),但不影响大家理解。

只有同学发现leetcode上“515. 在每个树行中找最大值”,也是层序遍历的应用,依然可以分分钟解决,所以就是一鼓作气解决六道了,哈哈。

「层序遍历遍历相对容易一些,只要掌握基本写法(也就是框架模板),剩下的就是在二叉树每一行遍历的时候做做逻辑修改。」

周六

在二叉树:你真的会翻转二叉树么?中我们把翻转二叉树这么一道简单又经典的问题,充分的剖析了一波,相信就算做过这道题目的同学,看完本篇之后依然有所收获!

「文中我指的是递归的中序遍历是不行的,因为使用递归的中序遍历,某些节点的左右孩子会翻转两次。」

如果非要使用递归的中序的方式写,也可以,如下代码就可以避免节点左右孩子翻转两次的情况:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;
        invertTree(root->left);         // 左
        swap(root->left, root->right);  // 中
        invertTree(root->left);         // 注意 这里依然要遍历左孩子,因为中间节点已经翻转了
        return root;
    }
};

代码虽然可以,但这毕竟不是真正的递归中序遍历了。

但使用迭代方式统一写法的中序是可以的。

代码如下:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        stack st;if (root != NULL) st.push(root);while (!st.empty()) {
            TreeNode* node = st.top();if (node != NULL) {
                st.pop();if (node->right) st.push(node->right);  // 右
                st.push(node);                          // 中
                st.push(NULL);if (node->left) st.push(node->left);    // 左
            } else {
                st.pop();
                node = st.top();
                st.pop();
                swap(node->left, node->right);          // 节点处理逻辑
            }
        }return root;
    }
};

为什么这个中序就是可以的呢,因为这是用栈来遍历,而不是靠指针来遍历,避免了递归法中翻转了两次的情况,大家可以画图理解一下,这里有点意思的。

总结

「本周我们都是讲解了二叉树,从理论基础到遍历方式,从递归到迭代,从深度遍历到广度遍历,最后再用了一个翻转二叉树的题目把我们之前讲过的遍历方式都串了起来。」

下周依然是二叉树,大家加油!

在留言区留下你的思路吧!

-------end-------

我将算法学习相关的资料已经整理到了Github :https://github.com/youngyangyang04/leetcode-master,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图看一看一定会有所收获,如果给你有帮助给一个star支持一下吧!

另外因为公众号改版,时间线被打乱,一些精彩文章大家可能错过了。如果感觉这里的文章对你有帮助,赶紧给「代码随想录」加一个星标吧,方便第一时间阅读文章往期精彩回顾二叉树:你真的会翻转二叉树么?二叉树:层序遍历登场!二叉树:前中后序迭代方式的写法就不能统一一下么?二叉树:听说递归能做的,栈也能做!二叉树:一入递归深似海,从此offer是路人关于二叉树,你该了解这些!「代码随想录」期待你的关注!

每天8:35准时推送一道经典算法题目,推送的每道题目都不是孤立的,而是由浅入深,环环相扣,帮你梳理算法知识脉络,轻松学算法!

4d0c147f2b06abc52278a764a2c5eca3.png3f9ad7534e0fb7e55838d5d9559d543a.png刷题可以加我微信!右边为个人微信,添加时备注:「简单自我介绍」+「组队刷题」我就知道你[在看]c27d208036bccead0229086628f0569d.gif

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

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

相关文章

vue导入swiper_vue项目中导入swiper插件的方法

这篇文章主要为大家详细介绍了vue项目中导入swiper插件的方法,具有一定的参考价值,可以用来参考一下。感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧!版本选择swiper是个常用的插件,现在已经迭代到了第四代…

设置MYSQL数据库编码为UTF-8

1、 编辑MySql的配置文件 MySql的配置文件Windows下一般在系统目录下或者在MySql的安装目录下名字叫my.ini,可以搜索,Linux下一般是/etc/my.cnf --在 [mysqld] 标签下加上以下内容: default-character-set utf8 character_set_server utf8…

5G核心网关键技术总览

来源:电子万花筒未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网&…

samba安装_Centos安装Samba

1.先安装相关依赖以及库:yum install -y gcc-cyum install -y pcre pcre-develyum install -y zlib zlib-develyum install -y openssl openssl-devel2.下载nginx安装包:wget -c https://nginx.org/download/nginx-1.12.0.tar.gz然后直接解压tar -zxvf n…

c++函数为什么带imp_二次函数含参最值问题,老师怎么讲学生都不明白,试试这九张动图...

“一入函数深似海,从此数学是路人”很多同学都有这样的感觉。问:数学是从什么开始听不懂了?答:学函数的时候。函数问题作为中学阶段数学重要的知识点,真的是难倒了很多同学。数学老师也非常的痛苦,每次讲完函数问题&am…

解析 | 自动驾驶视觉定位与导航技术的研究与应用

来源:驭势未来视觉定位与导航技术是智能体具备的基础能力之一,随着无人驾驶的发展,基于低成本摄像头及人工智能算法的视觉定位与导航技术成为了无人驾驶的主流技术路线之一。在传统工作方式中,视觉定位与导航技术通常采用SLAM&…

c# 配置文件App.config操作类库

public class ConfigOperator{#region 从配置文件获取Value/// <summary>/// 从配置文件获取Value/// </summary>/// <param name"key">配置文件中key字符串</param>/// <returns></returns>public static string GetValueFromC…

visual studio 调试 定义debug常量_有趣的阅读 12个提高生产力的Visual Studio调试技巧...

以前因为工作的关系&#xff0c;接触过不少程序员同行&#xff0c;发现很多同学对所谓的小技巧tips感兴趣。本文就是一篇很有趣的文章&#xff0c;总结介绍了12个关于“宇宙第一IDE”—— Visual Studio的实用技巧。善加利用这些小技巧&#xff0c;能够在使用Visual Studio进行…

2016专接本c语言真题_云南特岗教师考试真题(中学信息技术)9套(无答案)

目录&#xff1a;1. 云南省2009年中央特岗计划教师招考试卷&#xff08;中学信息技术&#xff09;2. 云南省2010年中央特岗计划教师招考试卷&#xff08;中学信息技术&#xff09;3. 云南省2011年中央特岗计划教师招考试卷&#xff08;中学信息技术&#xff09;4. 云南省2013年…

淘金尖端领域:全球量子技术最新投资趋势

IBM50量子位量子计算机原型&#xff08;来源&#xff1a;IBM&#xff09;来源&#xff1a;资本实验室 作为一个少有人参与的尖端领域&#xff0c;量子技术除了在少数国家的政府部门与科研机构&#xff0c;以及科技巨头的推动之下缓慢成长&#xff0c;也正在通过越来越多的创业公…

teamviewer设备数量上限怎么解决_支小蜜刷脸支付设备解决方案,支小蜜刷脸支付设备怎么使用...

高校刷脸支付解决方案&#xff0c;用于解决高校消费场景支付需求&#xff0c;在线上通过高校人脸小程序完成学生认证&#xff0c;面容录入&#xff0c;开通刷脸支付。开通刷脸支付后&#xff0c;可以在学校内通过刷脸进行支付(校园食堂消费、校园超市消费等)。这个方案将支付宝…

字符串删除重复字符

ASCII编码对应的十进制为 0 到 127&#xff0c;对其 进行 强制类型转换后可转化为数组下标 将数组内元素初始值置为0&#xff0c;遇到一个元素第一次出现时&#xff0c;将数组内元素置为1&#xff0c;其后判断数组内元素不为0&#xff0c;则不再操作。 int myArray[128] {0}; …

[Matlab]函数表达式运算

MATLAB对函数表达式进行求和 有时候要进行函数表达式的计算 syms m; %m是符号&#xff0c;声明符号 f1exp(-im*1); f2exp(-im*2); ff1f2;%可以以符号的形式存储下来%计算% subs(f,m,1);%将f中的m替换为1&#xff0c;最好用单引号把变量括起来总结一下&#xff0c;syms用于声明…

reload vue 重新加载_vue面试,谈下router拦截

最近开始准备面试&#xff0c;尽管是电话面试全身还是充斥着紧张感&#xff0c;一面感觉还不错&#xff0c;主要是问react和vue的一些生命周期&#xff0c;介绍下redux...&#xff0c;二面印象深刻的是问到了介绍下router拦截&#xff0c;我觉得还是个人对router 的理解不够&am…

文小刚:创新就是孩子的游戏

来源&#xff1a; 返朴 撰文 | 文小刚 &#xff08;麻省理工学院终身教授、格林讲席教授&#xff09;1什么是创新应用科学&#xff08;工程技术&#xff09;的目的是利用已知的知识&#xff0c;创造社会价值&#xff0c;造福人类。而基础科学的目的是创造新知识&#xff0c;开拓…

bzoj1532: [POI2005]Kos-Dicing

1532: [POI2005]Kos-Dicing Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1520 Solved: 516[Submit][Status][Discuss]Description Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评…

python搭配什么数据库_python 连接操作数据库(一)

一、下面我们所说的就是连接mysql的应用&#xff1a; 1、其实在python中连接操作mysql的模块有多个&#xff0c;在这里我只给大家演示pymysql这一个模块&#xff08;其实我是感觉它比较好用而已&#xff09;&#xff1a; pymysql是第三方的一个模块&#xff0c;需要我们自己安装…

【用word快速输入公式】希腊字母名称和大小写

用word按住alt和加号&#xff0c;先输入\ 然后后面跟代码&#xff0c;输完以后用空格转换。 输入大写就首字母大写&#xff0c;小写就首字母小写。代码基本就是发音。 大写小写发音AαAlphaBβBetaΓγGammaΔδDeltaΕεEpsilonΖζZetaΝνNuΞξXiOοOmicronΠπPiPρRhoΣ…

xadsafe做暗刷_深蓝维护通道有暗刷? - 综合技术讨论大区 - 死性不改BBS - 网维行业自由、中立的技术与信息交流平台 - Powered by Discuz!...

本帖最后由 小米 于 2018-4-27 04:52 编辑今天发现的&#xff0c;只要一打开QQ&#xff0c;C盘根目录生成NTDETECT.HTA文件&#xff0c;内容是>tpircs/<esolc.wodniw)Li(nuR.llehS005 peels.tpircsw2,Li eliFoTevaS.teGa)ydoBesnopser.tsoP(etirW.teGa)(nepO.teGa1epyT.t…

GE数字化重塑的启示:调整阵型,再战工业互联网!

来源&#xff1a;中国华能&#xff08;部分内容参考《财经》杂志韩舒淋“从GE数字化业务大调整看工业互联网未来”&#xff09;打响“工业互联网”第一枪的GE&#xff08;美国通用电气&#xff09;&#xff0c;曾是全球市值最高的工业巨头&#xff0c;如今市值却缩水至巅峰时期…