本周小结!(二叉树系列三)
本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!
本周小结
是不是感觉这周过的非常快,好像刚刚做完本周小结,又要做本周小结了,果然假期让人感觉时光飞逝,哈哈。
周一
在二叉树:以为使用了递归,其实还隐藏着回溯中,通过leetcode 257.二叉树的所有路径这道题目,讲解了递归如何隐藏着回溯,一些代码会把回溯的过程都隐藏了起来了,甚至刷过这道题的同学可能都不知道自己用了回溯。
文章中第一版代码把每一个细节都展示了输出来了,大家可以清晰的看到回溯的过程。
然后给出了第二版优化后的代码,分析了其回溯隐藏在了哪里,如果要把这个回溯扣出来的话,在第二版的基础上应该怎么改。
主要需要理解:回溯隐藏在traversal(cur->left, path + “->”, result);中的 path + “->”。 每次函数调用完,path依然是没有加上"->" 的,这就是回溯了。
周二
在文章二叉树:做了这么多题目了,我的左叶子之和是多少? 中提供了另一个判断节点属性的思路,平时我们习惯了使用通过节点的左右孩子判断本节点的属性,但发现使用这个思路无法判断左叶子。
此时需要相连的三层之间构成的约束条件,也就是要通过节点的父节点以及孩子节点来判断本节点的属性。
这道题目可以扩展大家对二叉树的解题思路。
周三
在二叉树:我的左下角的值是多少?中的题目如果使用递归的写法还是有点难度的,层次遍历反而很简单。
题目其实就是要在树的最后一行找到最左边的值。
如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。
在这篇文章中,我们使用递归算法实实在在的求了一次深度,然后使用靠左的遍历,保证求得靠左的最大深度,而且又一次使用了回溯。
如果对二叉树的高度与深度又有点模糊了,在看这里二叉树:我平衡么?,回忆一下吧。
二叉树:我的左下角的值是多少?中把我们之前讲过的内容都过了一遍,此外,还用前序遍历的技巧求得了靠左的最大深度。
求二叉树的各种最值,就想应该采用什么样的遍历顺序,确定了遍历循序,其实就和数组求最值一样容易了。
周四
在二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?中通过两道题目,彻底说清楚递归函数的返回值问题。
一般情况下:如果需要搜索整颗二叉树,那么递归函数就不要返回值,如果要搜索其中一条符合条件的路径,递归函数就需要返回值,因为遇到符合条件的路径了就要及时返回。
特别是有些时候 递归函数的返回值是bool类型,一些同学会疑惑为啥要加这个,其实就是为了找到一条边立刻返回。
其实还有一种就是后序遍历需要根据左右递归的返回值推出中间节点的状态,这种需要有返回值,例如222.完全二叉树,110.平衡二叉树,这几道我们之前也讲过。
周五
之前都是讲解遍历二叉树,这次该构造二叉树了,在二叉树:构造二叉树登场!中,我们通过前序和中序,后序和中序,构造了唯一的一颗二叉树。
构造二叉树有三个注意的点:
- 分割时候,坚持区间不变量原则,左闭右开,或者左闭又闭。
- 分割的时候,注意后序 或者 前序已经有一个节点作为中间节点了,不能继续使用了。
- 如何使用切割后的后序数组来切合中序数组?利用中序数组大小一定是和后序数组的大小相同这一特点来进行切割。
这道题目代码实现并不简单,大家啃下来之后,二叉树的构造应该不是问题了。
最后我还给出了为什么前序和后序不能唯一构成一棵二叉树,因为没有中序遍历就无法确定左右部分,也就无法分割。
周六
知道了如何构造二叉树,那么使用一个套路就可以解决文章二叉树:构造一棵最大的二叉树中的问题。
注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下表索引直接在原数组上操作,这样可以节约时间和空间上的开销。
文章中我还给出了递归函数什么时候加if,什么时候不加if,其实就是控制空节点(空指针)是否进入递归,是不同的代码实现方式,都是可以的。
一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。
总结
本周我们深度讲解了如下知识点:
- 递归中如何隐藏着回溯
- 如何通过三层关系确定左叶子
- 如何通过二叉树深度来判断左下角的值
- 递归函数究竟什么时候需要返回值,什么时候不要返回值?
- 前序和中序,后序和中序构造唯一二叉树
- 使用数组构造某一特性的二叉树
如果大家一路跟下来,一定收获满满,如果周末不做这个总结,大家可能都不知道自己收获满满,啊哈!
还等啥,赶紧转发给身边需要学习的同学吧!
我是程序员Carl,利用工作之余重刷leetcode,更多精彩算法文章尽在:代码随想录,关注后,回复「Java」「C++」「python」「简历模板」等等,有我整理多年的学习资料,可以加我微信,备注「简单自我介绍」+「组队刷题」,拉你进入刷题群(无任何广告,纯个人分享),每天一道经典题目分析,我选的每一道题目都不是孤立的,而是由浅入深一脉相承的,如果跟住节奏每篇连续着看,定会融会贯通。
以下资料希望对你有帮助:
- 学习资料以及我的开源项目
- 我的B站视频:算法和编程语言的讲解
- leetcode刷题攻略
- 程序员应该如何写简历(附简历模板)
- 一线互联网公司技术面试的流程以及注意事项
- C++面试&C++学习指南知识点整理
如果感觉题解对你有帮助,不要吝啬给一个
给「代码随想录」一个星标吧! ❝ 以后每周加上一个本周小结怎么样? ❞ 本周小结 发现大家周末的时候貌似都不在学习状态,周末的文章浏览量和打卡情况照工作日差很多呀,可能是本周日是工作日了,周六得好好放 ... 给「代码随想录」一个星标吧! ❝ 有学习就要有总结 ❞ 本周小结 本周赶上了十一国庆,估计大家已经对本周末没什么概念了,但是我们该做总结还是要做总结的. 本周的主题其实是「简单但并不简单」,本周所选的 ... 前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ... VSTO之旅系列(三):自定义Excel UI 原文:VSTO之旅系列(三):自定义Excel UI 本专题概要 引言 自定义任务窗体(Task Pane) 自定义选项卡,即Ribbon 自定义上下文 ... @Author:Runsen @Date:2020/7/6 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ... 保持热爱,共赴山海! 12 月 28 日,依旧是 19:30,小米新品发布会正式拉开帷幕. 在这场发布会上,小米新品"吸睛无数",不止一系列自研技术加持的 MIUI 13 And ... 电子信息类专业属于前沿科技,也是一个宽口径就业的专业.当前社会是信息网络时代,计算机.电子信息行业发展非常迅速,可以用日新月异来形容,在将来一定的时期内会持续大热,同时也会给人类带来意想不到的生活便利 ... 保持热爱,共赴山海! 作者 |苏宓 出品 | CSDN(ID:CSDNnews) 12 月 28 日,依旧是 19:30,小米新品发布会正式拉开帷幕. 在这场发布会上,小米新品"吸睛无数&q ... 电子信息类专业属于前沿科技,也是一个宽口径就业的专业.当前社会是信息网络时代,计算机.电子信息行业发展非常迅速,可以用日新月异来形容,在将来一定的时期内会持续大热,同时也会给人类带来意想不到的生活便利 ... 机器学习-白板推导系列(三十)-生成模型(Generative Model) 30.1 生成模型的定义 前面所详细描述的模型以浅层的机器学习为主.本章将承上启下引出后面深度机器学习的部分.本小节,主要 ...本周小结!(二叉树系列三)相关推荐
最新文章
热门文章