代码随想录算法训练营第二十天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
最大二叉树
题目:654.最大二叉树
题目链接:https://leetcode.cn/problems/maximum-binary-tree/
文章讲解:https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html
视频讲解:https://www.bilibili.com/video/BV1MG411G7ox/
状态:
自己看到题目的第一想法
最大二叉树和给中序、给前序数组然后进行切割计算类似。
先取根节点,然后再进行切割。
核心是切割的时候按照循环不变量来处理:开始切割,[0,maxValueIndex)为左树,[maxValueIndex + 1,nums.length)为右树。
看完代码随想录之后的想法
思路一致
自己实现过程中遇到哪些困难
无
合并二叉树
617. 合并二叉树
文章讲解:https://programmercarl.com/0617.%E5%90%88%E5%B9%B6%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
题目链接:https://leetcode.cn/problems/merge-two-binary-trees/
视频讲解:https://www.bilibili.com/video/BV1m14y1Y7JK/
自己看到题目的第一想法
使用后序遍历处理逻辑,先处理左节点合并,合并完后给根节点赋值为root.left。再处理右节点合并,合并完后给根节点赋值为root.right。最后处理中节点的相加。
核心是递归终止判断,同时遍历两个树,左树为空返回右树,右树为空返回左树,都为空返回null。
看完代码随想录之后的想法
和自己写的代码逻辑一样
自己实现过程中遇到哪些困难
无
二叉搜索树中的搜索
700.二叉搜索树中的搜索
文章讲解:https://programmercarl.com/0700.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%90%9C%E7%B4%A2.html
题目链接:https://leetcode.cn/problems/search-in-a-binary-search-tree/
视频讲解:https://www.bilibili.com/video/BV1wG411g7sF/
状态:
自己看到题目的第一想法
返回该节点为根的子树,则可以直接使用前序遍历。
- 先判断根节点
- 判断左节点,如果有相同的节点就直接返回
- 判断右节点,若存在返回右节点
- 若都无则返回null
看完代码随想录之后的想法
自己实现过程中遇到哪些困难
验证二叉搜索树
98.验证二叉搜索树
文章讲解:https://programmercarl.com/0098.%E9%AA%8C%E8%AF%81%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
题目链接:https://leetcode.cn/problems/validate-binary-search-tree/
视频讲解:https://www.bilibili.com/video/BV18P411n7Q4/
状态:
自己看到题目的第一想法
直接递归处理,递归三步骤:
- 确定参数和返回值,参数为boolean类型的值,参数是根节点
- 循环终止的判断,节点的左右都为空,则直接返回true。
- 单层的处理逻辑:
3.1. 左节点为空,右节点不为空,判断值大小,若中小于右,递归右节点,返回值
3.2. 右节点为空,左节点不为空,判断值大小,若中大于左,递归左节点,返回值
3.3. 左右都不为空,判断大小,并递归2个孩子节点,返回值
3.4. 判断左右返回值取且,返回
看完代码随想录之后的想法
自己踩坑了,右节点的所有值都需要大于根节点,而我在处理逻辑的时候只处理了右树当前中间节点大于左节点的逻辑,没有再用右树的父节点做比较。
不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。
代码随想录将二叉树通过中序遍历求出数组,再判断数组是不是递增的来处理逻辑。
自己实现过程中遇到哪些困难
最简单的递归逻辑忘记怎么写了,实在是太差了!
递归要画一下图,注意回退的逻辑。
今日收获&学习时长
学习大概2小时
对于递归的话还是需要加强一下回退逻辑的概念,目前基本上都是照着代码模版写,很容易遗忘。