力扣日刷45

讲真,递归一直是我的噩梦,今天就来看看自己的软肋能不能说得清楚吧哈哈哈。

104,二叉树的最大深度

递归过程包含3个要素:1.边界条件,2.非边界条件 3.子问题拆分。

首先是边界条件最大二叉树的深度,到叶子节点的左右肯定是0,因为它是空结点。好那我们看看边界条件,边界条件就是最后一步需要返回什么,也就是到边界了该返回什么这里来说就是返回0,下一步,我们需要看看子问题怎么去拆分,找子树深度我们需要去遍历整个树,所以这里的递归就循环调用当前的方法也就是self.方法,通过不断把左右子树放入然后返回去完全遍历树。这里的返回值就是左右子树中比较深的那一棵子树的深度+1.

下面是代码

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root ==None:
            return 0
        
        else:
            l_val = self.maxDepth(root.left)
            r_val = self.maxDepth(root.right)
            return max(l_val , r_val) + 1

100,相同的树

讲真其实这道题让我自己写还是很想,他的边界条件是左右树遍历节点遍历到为空的时候是否都为空,如果是都是空就返回1,否则就返回0。然后非边界的条件就是当前的值都相等的话返回一个1不然就返回0,一样的需要分为左右子树不同地去做推理判断。

然后代码确实太简单了,简单到emm我有点感觉自己的智慧不能驾驭哈哈哈。

就是先来个边界条件,然后返回值设置成3个判断。其中有两个是递归判断

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
        if p is None or q is None:
            return p is q
        
        return p.val == q.val and self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
        

101.对称二叉树

这一题其实跟上一题判断是否为相同的子树是一样的,只是我们的条件需要去做一下更换,对称的二叉树,需要对比的是左树的左树跟右树的右树,有点绕口不过确实就是这样的。下面是代码

用到了上一题的判断两个树是否相等的递归代码

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def issametree(self, p, q):
        if p is None or q is None:
            return p is q
        return p.val == q.val and self.issametree(p.left,q.right) and self.issametree(p.right,q.left) 
        
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        l = root.left
        r = root.right
        return self.issametree(l,r)
        

110.平衡二叉树

这道题有点意思,这道题是求取树的深度的plus版本,这里我们的解法也是比较有意思。我们需要设置一个判定返回值-1作为我们判断树不平衡的一个指标。如果返回值为-1那树就不平衡,反之返回最大的深度的信息。那什么时候返回-1呢?第一种情况是收到的值为-1了那就直接走快速路返回-1,否则进行下一步,第二种情况是新碰到-1了,就是左右子树的差绝对值大于1,这种情况我们需要去返回-1.最后把结果返回。在主函数中调用高度函数,塞入初始节点即可

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        def get_height(node):
            if node ==None:
                return 0
            
            l_val = get_height(node.left)
            if l_val == -1:
                return -1

            r_val =  get_height(node.right)
            if r_val == -1:
                return -1
            
            if abs(l_val - r_val)>1:
                return -1
            return max(l_val,r_val) + 1
        return get_height(root) is not -1

199.二叉树的右视图

这一题很有意思,需要我们拿取右边的所有元素,我们具体怎么实现呢?首先我们需要制造一个函数,可以传递层数与深度,然后我们根据不同的深度去做判断与递归。当深度满足时append新元素。具体看下面代码吧,有点困了,回宿舍看我是大哥大去了,晚安各位

python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        ans = []
        def f(node, depth):
            if node is None:
                return 
            if depth == len(ans):
                ans.append(node.val)
            f(node.right,depth+1)
            f(node.left ,depth+1)
        f(root,0)
        return ans

        
相关推荐
aqiu111111几秒前
【算法日记 13】LeetCode 49. 字母异位词分组:哈希表的进阶“降维打击”
算法·leetcode·散列表
KaMeidebaby10 分钟前
卡梅德生物技术快报|纳米抗体技术全套实操流程:AFB1 全合成文库淘选 + 分子对接定点突变参数手册
人工智能·python·tcp/ip·算法·机器学习
帅次17 分钟前
Android 高级工程师面试:Flow 与状态流 近1年高频追问 22 题
android·面试·职场和发展
2601_962851741 小时前
计算机毕业设计之基于YOLOV10的低光照目标检测算法研究与实现
大数据·算法·yolo·目标检测·信息可视化·cnn·课程设计
magicwt1 小时前
快手自动出价论文GAVE阅读笔记
算法
智者知已应修善业1 小时前
【P12159蓝桥杯数组翻转】2025-4-24
c语言·c++·经验分享·笔记·算法·蓝桥杯
小巧的砖头2 小时前
使用SVN+CruiseControl+ANT实现持续集成之一
学习·算法
人道领域2 小时前
【LeetCode刷题日记】贪心算法理论与实战:455.分发饼干最优解
java·开发语言·数据结构·算法·leetcode·贪心算法
小O的算法实验室2 小时前
2026年ACM TCH,动态救护车路径优化:结合 K-means 聚类与多目标粒子群算法两阶段策略
算法
在书中成长3 小时前
HarmonyOS 小游戏《对战五子棋》开发第8篇 - GomokuEngine核心引擎设计(三):五子连珠判定算法
算法·华为·harmonyos