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,一经查实,立即删除!

相关文章

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&…

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

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

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

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

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

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

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

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

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

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

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的应用: 1、其实在python中连接操作mysql的模块有多个,在这里我只给大家演示pymysql这一个模块(其实我是感觉它比较好用而已): pymysql是第三方的一个模块,需要我们自己安装…

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

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

python简单图画程序_用Python的Turtple画图形

不知道各位是否还记得在小学或者初中的时候,我们接触过一种语言叫做logo语言,这个语言可以画正方形,画三角形,画圆。而用Python画图形也有点类似logo语言的意思。 在画图之前,我们需要启动一个模块,turtple…

freeRTOS实时操作系统学习笔记

温馨提示:点击图片查看大图更清晰 —————————————————————————————↑↑↑上方资源下载后可获取xmind原文件。 1、freeRTOS移植和配置脑图 2、内核源码学习

通用AI——未来真正强健的人工智能?

来源:王宏琳科学网博客一本新书纽约大学马库斯(Gary Marcus)教授和戴维斯(Ernest Davis)教授2019年新书(参考资料[1])的书名,颇吸引眼球:《Rebooting AI : 构建我们可以信…

python开发工具管理系统_Python开发桌面软件文档及网址管理工具,强迫症的福音...

原标题:Python开发桌面软件文档及网址管理工具,强迫症的福音写在前面 这两天用python鼓捣开发了一个软件,分享给同事,觉得很实用,可以大大提高工作效率,想通过平台分享出来给大家 希望给爱好python的童鞋做…

halcon 将数据保存到excel_pandas筛选、合并、批量保存excel数据

人生苦短,我学python!python是目前最流行的编程语言,功能十分强大,在爬虫、数据分析、人工智能方面均得以广泛应用。本专辑主要分享两个数据分析库numpy和pandas在数据分析方面的基础知识和各种技能,pandas的快、准、简…

边缘计算参考架构3.0

来源:萤火虫智能家居沙龙全球已经掀起行业数字化转型的浪潮,数字化是基 础,网络化是支撑,智能化是目标。通过对人、物、环境、过程等对象,进行数字化而产生数据,通过网络化实 现数据的价值流动,…

tensorflow 转张量类型为float_5个简单的步骤掌握Tensorflow的Tensor

在这篇文章中,我们将深入研究Tensorflow Tensor的细节。我们将在以下五个简单步骤中介绍与Tensorflow的Tensor中相关的所有主题:第一步:张量的定义→什么是张量?第二步:创建张量→创建张量对象的函数第三步&#xff1a…

华为手机怎么使用读卡器_华为手机使用小窍门

华为手机电池耐用,信号好,系统流畅,外观也一改以往的呆板现在追求时尚,所以深得国人的喜爱,也因为美国的打压激起了国人的爱国意识,华为在国内手机销量高居第一,使用的人很多。现在国产最好的手…