代码随想录算法训练营第十七天|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
平衡二叉树
题目:110.平衡二叉树
题目链接:https://leetcode.cn/problems/balanced-binary-tree/
文章讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html
视频讲解:https://www.bilibili.com/video/BV1Ug411S7my/
状态:
自己看到题目的第一想法
使用后序遍历,后序遍历可以拿到左、右节点的高度,当差大于1时就直接返回false。
后序左 右 中,左边高度-右边高度,差大于1时返回false。
看完代码随想录之后的想法
整体思路类似,都是使用后序遍历计算高度值,但是代码随想录的方法返回的只是节点最大高度,而我的方法返回的左右节点的高度差。
代码随想录返回的高度,使用一个-1代表高度超过2。整体还是遵循左递归、右递归、中计算的执行顺序去做逻辑处理。
自己实现过程中遇到哪些困难
高度差的方式在第二个case执行时失败了,但是自己没有继续调试。因为时间太紧了,上班太忙时间很难凑。
二叉树的所有路径
257. 二叉树的所有路径
文章讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html
题目链接:https://leetcode.cn/problems/binary-tree-paths/
视频讲解:https://www.bilibili.com/video/BV1ZG411G7Dh/
自己看到题目的第一想法
递归法这里看起来应该使用前序遍历,并且先遍历完左节点后需要将中间节点返回回去让右边的节点继续迭代。
递归三步骤思考:
- 出入参数:最终结果数组List,根节点,
- 递归终止条件
- 每次循环的处理逻辑
看完代码随想录之后的想法
方法确实是使用前序遍历+递归去处理逻辑。
递归的三步骤:
- 出参数为void,入参数为节点、path列表以及结果列表
- 递归循环的终止条件:左右子节点都为空,则将path结果转换为字符串放入结果集
- 单层循环的处理逻辑:左右子节点递归完后处理回溯,将节点从path弹出。
核心的逻辑是回溯的处理,通过路径数组path的回溯,将1->2->5 回溯到1,然后再执行右节点。
自己实现过程中遇到哪些困难
- 回溯节点时在哪里做回溯操作没思考清楚。1->2->5处理完了,然后再弹出5、弹出2,因此回溯的位置应该是在做左递归或者右递归的节点后处理的。
左叶子之和
404.左叶子之和
文章讲解:https://programmercarl.com/0404.%E5%B7%A6%E5%8F%B6%E5%AD%90%E4%B9%8B%E5%92%8C.html
题目链接:https://leetcode.cn/problems/sum-of-left-leaves/
视频讲解:https://www.bilibili.com/video/BV1GY4y1K7z8/
状态:AC
自己看到题目的第一想法
先整理下思路看一下该方法应该用前序、后序、还是中序遍历去执行。
刚开始以为应该用后序,写完代码后发现是前序。
返回所有左叶子之和的话就需要判断当前节点是否为左叶子,如果是左叶子则返回值。那核心就是怎么判断当前的节点为左叶子,左叶子:当前节点是左子节点且无下级节点。
因此在每次递归时,我都将当前节点是否为左节点作为参数传递到递归方法内。
看完代码随想录之后的想法
整体逻辑差不多,这里没有使用加参数去判读当前节点是否为左节点的方式。而是直接使用 node.left != null && node.left.left == null && node.left.right == null 判断左子树为左叶子节点
自己实现过程中遇到哪些困难
无
今日收获&学习时长
学习时长:接近2小时