代码随想录算法训练营第十八天 | 513.找树左下角的值,112. 路径总和,113.路径总和ii,106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列构造二叉树
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.分割回文串一、513.找树左下角的值
题目链接:
学习前:
思路:
层序遍历。采用递归和迭代两种方式
- 递归:定义最大深度和目标值两个成员变量,方法参数是结点和当前结点的深度;返回类型为void;终止条件为结点为空;单次循环内容为判断该节点是否符合目标要求,且分别传入左子树和右子树,且深度分别加一,进行递归调用
- 迭代:new一个队列,存层次遍历的结点,取每一层的第一个结点值进行赋值,遍历结束后即为所求
学习后:
进行代码优化。对于递归,判断该节点是否符合目标要求作为终止条件,且在递归调用左子树和右子树时进行判空
二、112. 路径总和
题目链接:
学习前:
思路:
前序遍历。采用递归方式
- 递归:定义sum累加从根结点到叶子结点的和
- 方法参数:(TreeNode root, int targetSum, int sum)
- 返回类型:boolean
- 终止条件:结点为空返回false;碰到叶子结点,满足目标返回true,反之返回false
- 单次循环内容:首先在终止条件之间加入sum累加当前结点值,接着此时的结点一定非空且非叶子结点,故若左子树存在,则递归调用左孩子,若结果返回true,则返回true;右子树同理;本次循环若在这些地方都没返回,则返回false
学习后:
- 不用额外定义sum,直接用targetSum做减法,判断是否为0即可
三、113.路径总和ii
题目链接:
学习前:
思路:
前序遍历。采用递归方式
-
递归:定义sum累加从根结点到叶子结点的和
- 方法参数:(TreeNode root, int targetSum),其中成员变量List res是结果集合,成员变量List per是单条路径值集合
- 返回类型:void
- 终止条件:结点为空;碰到叶子结点,其中若符合题意则res.add
- 单次循环内容:若左右孩子存在,则分别进行递归调用,且回溯per,删除最后一个元素
学习后:
将成员变量List res和List per降为方法参数,减小内存开销
四、106.从中序与后序遍历序列构造二叉树
题目链接:
学习前:
思路:
递归
- 方法参数:(int[] inorder, int[] postorder)
- 返回类型:TreeNode
- 终止条件:if(inorder.length0) return null;if(inorder.length1) return root;
- 单次循环内容:
- 确定根结点即后序遍历最后一个值
- 找到中序遍历的根结点下标index
- 根据index将中序遍历切割成左中序和右中序两个数组
- 根据第3步切割的数组的长度将后序遍历切割成左后序和右后序两个数组
- 递归调用
学习后:
- 在对中序数组和后续数组进行切割时,不用再额外开辟新数组,通过下标进行访问,即方法参数变为(int[] inorder, int inorder_start, int inorder_end, int[] postorder, int postorder_start, int postorder_end)
- 注意对终止条件和单次循环内容的改写
五、105.从前序与中序遍历序列构造二叉树
题目链接:
学习后:
思路:
递归
- 方法参数:(int[] preorder, int[] inorder)
- 返回类型:TreeNode
- 终止条件:if(inorder.length0) return null;if(inorder.length1) return root;
- 单次循环内容:
- 确定根结点即前序遍历第一个值
- 找到中序遍历的根结点下标index
- 根据index将中序遍历切割成左中序和右中序两个数组
- 根据第3步切割的数组的长度将前序遍历切割成左前序和右前序两个数组
- 递归调用
六、学习总结
- 时间:5.5h
- 通过遍历顺序构建唯一二叉树
- 递归需要返回值和无需返回值的情况
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?