代码随想录算法训练营第十五天|层序遍历、226.翻转二叉树、101.对称二叉树
层序遍历
题目:层序遍历
题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/
https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/
https://leetcode.cn/problems/binary-tree-right-side-view/
https://leetcode.cn/problems/average-of-levels-in-binary-tree/
https://leetcode.cn/problems/n-ary-tree-level-order-traversal/
https://leetcode.cn/problems/find-largest-value-in-each-tree-row/
https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/
https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/
https://leetcode.cn/problems/maximum-depth-of-binary-tree/
文章讲解:https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
视频讲解:https://www.bilibili.com/video/BV1GY4y1u7b2/
状态:
自己看到题目的第一想法
直接看视频,加快效率
看完代码随想录之后的想法
使用队列来实现层序遍历,队列在执行循环过程中存储二叉树每一层的元素。
使用两个while循环处理逻辑,外层while循环判断队列是否为空,取队列的size作为本层的节点数用于内层while循环的条件,并构建空数组用于存储内层循环的返回值;内层while循环是遍历该层的节点逻辑,其循环判断条件为size是否大于0,并且在每次遍历节点时都将该节点的left和right加入到队列中(判空),每次执行完那层循环,size都会–。
自己实现过程中遇到哪些困难
十道题整体思路都差不多,没什么问题。
翻转二叉树
226.翻转二叉树
文章讲解:https://programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html
题目链接:https://leetcode.cn/problems/invert-binary-tree/
视频讲解:https://www.bilibili.com/video/BV1sP4y1f7q7/
自己看到题目的第一想法
无
看完代码随想录之后的想法
- 使用前序或者后序遍历+递归的方式去遍历二叉树,然后将左右进行翻转
- 确定递归三部曲:
- 确定递归函数的参数和返回值
- 确定终止条件
- 确定确定单层递归的逻辑
自己实现过程中遇到哪些困难
看完视频后实现比较简单
对称二叉树
101. 对称二叉树
文章讲解:https://programmercarl.com/0101.%E5%AF%B9%E7%A7%B0%E4%BA%8C%E5%8F%89%E6%A0%91.html
题目链接:https://leetcode.cn/problems/symmetric-tree/
视频讲解:https://www.bilibili.com/video/BV1ue4y1Y7Mf/
自己看到题目的第一想法
无
看完代码随想录之后的想法
- 使用后序遍历法,因为前序、中序都会先处理中间节点,而早的处理中间会导致无法感知到下级左右节点是否能对称
- 确定递归三部曲:
- 确定递归函数的参数和返回值(返回值为boolean,参数为leftNode和rightNode)
- 确定终止条件(两个为null返回true,一个为null一个不为null返回false,都不为null但是不想等返回false)
- 确定确定单层递归的逻辑(取两个要比较的下级节点进行递归比较,内侧比较和外侧比较用2个递归)
自己实现过程中遇到哪些困难
在处理完内侧比较和外侧比较后需要将外侧比较结果 && 内侧比较结果做返回。需要考虑到这个点。
今日收获&学习时长
学习了多个二叉树遍历的处理逻辑。
第一个是层序遍历,通过将节点放入到队列中,用队列的size控制循环的次数处理单层遍历的结果。
第二个是翻转二叉树,看到二叉树题目时,首先要考虑到遍历的方式,翻转二叉树的上下级节点不进行交换,因此可以采用前序遍历+递归的方式去处理,前序遍历先处理中间节点,然后再处理递归节点,中间节点直接交换中间节点的左右,然后再用递归去处理中间节点的左节点和右节点。
第三个是对称二叉树,同样看到二叉树题目时要考虑到遍历方式,因为对称二叉树的判断不能先处理中间节点,需要把中间节点的处理留在最后,因此使用后序遍历,先处理左右、再处理中。这里需要关注的是递归遍历法时的三大原则:1. 出入参确定(这里对称的话入参需要2个节点)2. 确定终止条件 3. 确定单层递归的逻辑。
今天学习了大概2个多小时,都是先看视频再完成代码,早上层序遍历连做了10题感觉记住了层序遍历的逻辑。后面的翻转二叉树和对称二叉树相对来说思路没这么清晰,还需要加强一下重刷一次。