代码随想录算法训练营第二十天|654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树
1.代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素2.代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II3.代码随想录算法训练营第三天 | 链表理论基础,203.移除链表元素,707.设计链表,206.反转链表4.代码随想录算法训练营第四天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II5.代码随想录算法训练营第五天 | 复习和总结6.代码随想录算法训练营第六天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1.两数之和7.代码随想录算法训练营第七天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和8.代码随想录算法训练营第八天 | 344.反转字符串,541.反转字符串II,卡码网:54.替换数字,151.翻转字符串里的单词,卡码网:55.右旋转字符串9.代码随想录算法训练营第十天 | 栈与队列理论基础,232.用栈实现队列,225.用队列实现栈10.代码随想录算法训练营第十一天|20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值11.代码随想录算法训练营第十三天 | 239. 滑动窗口最大值,347.前 K 个高频元素12.代码随想录算法训练营第十四天 | 二叉树理论基础,递归遍历,分别迭代遍历, 统一迭代遍历13.代码随想录算法训练营第十五天 | 层序遍历 ,226.翻转二叉树,101.对称二叉树14.代码随想录算法训练营第十六天 |104.二叉树的最大深度,559.n叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数15.代码随想录算法训练营第十八天 | 513.找树左下角的值,112. 路径总和,113.路径总和ii,106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列构造二叉树
16.代码随想录算法训练营第二十天|654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树
17.代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先18.代码随想录算法训练营第二十二天 | 235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点19.代码随想录算法训练营第二十三天 | 669. 修剪二叉搜索树,108.将有 序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树20.代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合21.代码随想录算法训练营第二十五天 | 216.组合总和III,17.电话号码的字母组合22.代码随想录算法训练营第二十七天 | 39. 组合总和,40.组合总和II,131.分割回文串一、654.最大二叉树
题目链接:
学习:
思路:
前序遍历
-
方法参数:(int[] nums, int start, int end)
-
返回类型:TreeNode
-
终止条件:
if(end-start==0) return null; if(end-start==1) return new TreeNode(nums[start]);
-
单层递归逻辑:
- 寻找数组中的最大值,确定根结点,下标为index
- 对nums数组进行切割,找到左子树的范围和右子树的范围,左闭右开
- 递归调用分别返回左孩子和右孩子
二、617.合并二叉树
题目链接:
学习前:
思路:
-
递归:
- 方法参数:(TreeNode root1, TreeNode root2)
- 返回类型:TreeNode
- 终止条件:3种结点为空的情况
- 单层递归逻辑:
- 此时root1和root2均为非空,故根结点的值相加作为新的根结点
- 递归调用分别返回左孩子和右孩子
-
迭代(栈):
- 首先为空判断
if(root1==null) return root2; if(root2==null) return root1; if(root1==null) return root2; else if(root1!=null && root2==null) return root1;
- 此时root1和root2均为非空,入栈值相加,当左右孩子均不为空时,依次入栈
- 返回root1
学习后:
优化了判空条件
if(root1==null) return root2;
if(root2==null) return root1;
三、700.二叉搜索树中的搜索
题目链接:
学习前:
思路:
-
递归:
-
方法参数:(TreeNode root, int val)
-
返回类型:TreeNode
-
终止条件:
-
if(root==null || root.val==val)return root;
-
单层递归逻辑:
val大于当前结点值,返回右子树;val小于当前结点值,返回左子树;val等于当前结点值,返回该结点
-
迭代(栈):
-
首先为空判断if(root!=null) stack.push(root);
-
栈不为空的循环,pop当前节点,若val大于当前结点值却右孩子不为空,右孩子入栈;若val小于当前结点值且左孩子不为空,左孩子入栈;val等于当前结点值,返回该结点
-
返回null
-
学习后:
二叉搜索树的特性使得迭代法可以不用额外辅助空间,直接用root进行移动
四、98.验证二叉搜索树
题目链接:
学习后:
思路: 中序遍历
-
递归:
-
方法参数:(TreeNode root)
-
返回类型:boolean
-
终止条件:
-
if(root==null || root.val==val)return root;
-
单层递归逻辑:
-
左:递归调用
-
中:需要一个pre记录前序结点,并且与左子树进行比较
if(pre!=null && root.val<=pre.val) return false; pre=root;
-
右:递归调用
-
-
迭代(栈):
-
需要一个pre记录前序结点。在中序遍历迭代方式中,对中的操作修改为
if(pre!=null && pre.val>=cur.val){ return false; } pre=cur;
-
五、学习总结
- 时间:3h
- 二叉搜索树的验证需要采用中序遍历,且要保证左子树的所有结点值小于中结点,且右子树的所有结点值大于根结点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端