力扣日刷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

        
相关推荐
白眼黑刺猬2 小时前
字节二面:订单状态回撤: 支付回调延迟导致的“先退单后下单”乱序,Flink如何利用Watermark和状态处理?
大数据·面试·职场和发展·flink
炽烈小老头2 小时前
【 每天学习一点算法 2026/04/06】常数时间插入、删除和获取随机元素
学习·算法
阿Y加油吧2 小时前
回溯算法双杀:子集 + 电话号码的字母组合 | 经典模板题解析
算法·leetcode
wuweijianlove2 小时前
算法验证与性能测试的统一框架设计的技术3
算法
LabVIEW开发2 小时前
LabVIEW插值应用
算法·labview·labview知识·labview功能·labview程序
yuanmazhiwu2 小时前
计算机毕业设计:Python智慧出行数据分析与模式识别系统 Django框架 可视化 数据分析 PyEcharts 交通 深度学习(建议收藏)✅
人工智能·python·算法·数据分析·django·flask·课程设计
沉鱼.442 小时前
第十一届题目
算法
C雨后彩虹2 小时前
箱子之字形摆放
java·数据结构·算法·华为·面试
小肝一下4 小时前
每日两道力扣,day5
数据结构·c++·算法·leetcode·职场和发展·hot100