leetcode每日一题复盘(10.23~10.29)

leetcode 450 删除二叉搜索树中的节点

见到二叉搜索树第一时间就应该想起用中序遍历(本题用哪种遍历都可以,因为本质上是查找),知道用什么遍历之后接下来想如何删除节点了(左右遍历根据节点大小决定向左向右移动)

遍历找不到目标节点,就不用进行操作直接返回根节点就好了

当遍历找到要删除的节点(root)时,根据子树情况进行分类处理:

1.左右子树都为空:

这种情况直接返回nullptr就可以了,因为删除节点相当于把节点变为空

2.左子树空右子树不为空

这种情况把要删除节点直接赋值成他的右子树即可,相当于删除了root节点,也可以直接返回右子树

3.右子树空左子树不为空

这种情况同上一种一样,本质是返回新节点

4.左右子树都存在

这种情况需要把右子树的第一个节点的位置顶上到原来节点root的位置,而左子树应该接在右子树的最左边,返回右子树的第一个节点


再一次讲回有返回值的递归:

如果递归是有返回值的(非bool型),那么在递归的时候必然是有变量来承接递归的返回值的

因此设计递归的时候用变量来接返回值

如果是返回bool型的递归,可以用if条件来判断,这种情况一般是查找一条符合条件的路径

leetcode 699 修剪二叉搜索树

类似于上一题的删除操作,但是有些地方不同,同样是删除操作,为什么一个是前序遍历一个是后序遍历呢?这确实让人迷惑,一开始我就写错了

原因是上一题的删除操作只涉及到一个节点(因为节点的值唯一),所以可以自顶向下进行操作,找到该节点就可以直接删除了;而本题涉及到n多个节点,如果使用前序遍历会导致剪掉一个节点后,接上去的那个节点无法继续剪枝!因此需要自底向上进行操作,符合条件的就不改变,不符合操作的进行对应剪枝,从底开始重构二叉搜索树,最后返回顶上的根

因此需要根据题目实际情况选择哪种遍历方式

leetcode 17 电话号码的字母组合

开始涉及到了回溯算法,说到回溯算法就应该知道backtrack是纵向遍历,for是横向遍历(把数据排成一个N叉树)

回溯算法本质上仍是递归,我们就可以用递归三部曲去设计回溯算法

1.设计回溯所需要的参数

除了需要遍历的数据外,还有其他在遍历时需要用到的参数(在这一题中就是num,用来记录递归的层数)

2.递归结束的条件

当递归层数达到要求的时候就可以return了

3.单层递归

当返回的数据是k位时,需要k层递归,相当于树的深度是k;遍历数据的长度是n,相当于树的宽度是n,n个数据就有n个子树

先回溯递归,进行纵向遍历(选择层数),然后再进行横向遍历,因此是backtrack里包含for

在for中进行数据处理以及递归,回溯等操作


这题第一个点是字符串的转换,要根据字符串里面的数字转换到对应的集合(借助哈希表),再在集合里面进行遍历操作,而且每一次遍历的集合都不一样,属于是不同数据之间的组合

根据传入的字符串和层数,获取对于的字符,将其转换为整数,作为哈希表的索引,来获取需要遍历的数据;for循环遍历对应数据,同时进行回溯递归

相关推荐
电鱼智能的电小鱼2 小时前
基于电鱼 AI 工控机的智慧工地视频智能分析方案——边缘端AI检测,实现无人值守下的实时安全预警
网络·人工智能·嵌入式硬件·算法·安全·音视频
孫治AllenSun2 小时前
【算法】图相关算法和递归
windows·python·算法
格图素书3 小时前
数学建模算法案例精讲500篇-【数学建模】DBSCAN聚类算法
算法·数据挖掘·聚类
DashVector4 小时前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索
AI纪元故事会4 小时前
【计算机视觉目标检测算法对比:R-CNN、YOLO与SSD全面解析】
人工智能·算法·目标检测·计算机视觉
夏鹏今天学习了吗4 小时前
【LeetCode热题100(59/100)】分割回文串
算法·leetcode·深度优先
卡提西亚4 小时前
C++笔记-10-循环语句
c++·笔记·算法
还是码字踏实4 小时前
基础数据结构之数组的双指针技巧之对撞指针(两端向中间):三数之和(LeetCode 15 中等题)
数据结构·算法·leetcode·双指针·对撞指针
Coovally AI模型快速验证7 小时前
当视觉语言模型接收到相互矛盾的信息时,它会相信哪个信号?
人工智能·深度学习·算法·机器学习·目标跟踪·语言模型
电院工程师7 小时前
SIMON64/128算法Verilog流水线实现(附Python实现)
python·嵌入式硬件·算法·密码学