代码随想录算法训练营第十五天 | 110.平衡二叉树、 257. 二叉树的所有路径、 404.左叶子之和、222.完全二叉树的节点个数

【教程】BM1684X-32边缘计算盒子 网络配置教程 BM1684X边缘计算盒子网络配置教程 阅读详情

110.平衡二叉树

自己写了一版,辅助函数同时算高度和是否是平衡的。

# 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 check(root, h):
            if not root:
                return h, True

            l, lb = check(root.left, h + 1)
            r, rb = check(root.right, h + 1)
            return max(l, r), lb and rb and abs(l - r) < 2 
        
        _, res = check(root, 0)
        return res

题解思路:

辅助函数只算高度,用-1表示不平衡了。

# 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 height(root):
            if not root:
                return 0

            l = height(root.left)
            if l == -1 : return -1
            r = height(root.right)
            if r == -1: return -1

            return -1 if abs(l - r) > 1 else 1 + max(l, r)

        if not root:
            return True

        return False if height(root) == -1 else True

257. 二叉树的所有路径

回溯,遇到叶子节点就收集结果。

# 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 binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        res = []

        def dfs(root, s):
            if not root:
                return
            if not root.left and not root.right:
                res.append(s + str(root.val))
                return
            
            dfs(root.left, s + str(root.val) + '->')
            dfs(root.right, s + str(root.val) + '->')

        dfs(root, '')
        return res

404.左叶子之和

闭包传递,稀里糊涂也写对了

# 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 sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        count = 0

        def dfs(root):
            nonlocal count
            if not root:
                return

            if not root.left and not root.right:
                return

            if root.left:
                if not root.left.left and not root.left.right:
                    count += root.left.val
                else:
                    dfs(root.left)
            if root.right:
                dfs(root.right)
        dfs(root)
        return count

看一下题解,向左边探查递归返回时查看是否是父节点的左叶子,如果是的话就找到一个左叶子,记录值。向右探查时也会一起赋值,思路相对巧妙。

# 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 sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        if not root.left and not root.right:
            return 0

        left = self.sumOfLeftLeaves(root.left)
        if root.left and not root.left.left and not root.left.right:
            left = root.left.val
        right = self.sumOfLeftLeaves(root.right)

        return left + right 

222.完全二叉树的节点个数

如果是个普通的二叉树,直接可以求解:

class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        
        return 1 + self.countNodes(root.left) + self.countNodes(root.right)

但是题目里面说了是个完全二叉树,完全二叉树可以节省时间,因为完全二叉树一个节点的左子树和右子树至少有一个是完全二叉树。

# 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 countNodes(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0

        left = root.left
        right = root.right
        l, r = 0, 0

        while left:
            left = left.left
            l += 1
        while right:
            right = right.right
            r += 1

        if l == r:
            return (2 << l) - 1

        return self.countNodes(root.left) + self.countNodes(root.right) + 1

TMS_WebGMaps_1.9.8.0_Full_Source TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder 立即下载

相关推荐

【智能体评测】BrowserUse:一款超越 Anthropic Computer Use 的开源智能体

本文将全面介绍 BrowserUse 的核心功能、配置与使用方法,以及通过多场景测试评估其性能。

surfirst的博客 4099

代码随想录算法训练营第十五天|222.完全二叉树的节点个数、110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。给定一个二叉树,判断它是否是 平衡二叉树。层(从第 0 层开始),则该层包含。,返回所有从根节点到叶子节点的路径。,求出该树的节点个数。给你一个二叉树的根节点。是指没有子节点的节点。,返回所有左叶子之和。

weixin_44302271的博客 731

CentOS7全隔离环境部署Nvidia Tesla A100 40G驱动与CUDA工具包实战

本文详细介绍了在CentOS7全隔离环境下部署Nvidia Tesla A100 40G显卡驱动与CUDA工具包的实战经验。通过构建本地YUM仓库、解决驱动依赖问题以及三重验证法,确保Tesla A100与CUDA 11.7的完美兼容。同时分享了Anaconda3离线部署技巧,帮助用户在隔离环境中高效搭建Python GPU开发环境。

weixin_27215337的博客 400

代码随想录算法训练营第十五天|LeetCode 110 平衡二叉树,LeetCode 257 二叉树的所有路径,LeetCode 404 左叶子之和,LeetCode 222 完全二叉树的节点个数

递归的方法还是太抽象了,让AI帮着画了个动画才理解了一点。今天用时2.5h,要出分了,好紧张,希望能坚持下去。递归真让人头大,要是我自己写肯定写不出来。还是层序遍历适合我,这个比较直观易懂。迭代法看上去比较复杂,还是先不管了。递归法还是比较好写的。

GOD_0034的博客 1289

使用Power Apps实现SharePoint Online列表的下拉菜单的级联选择

在SharePoint列表中添加数据的时候,下拉菜单的级联选择一直是一个非常实用的功能,尤其是有很多数据的情况,级联选择可以根据上一层的选择,自动过滤下一层的选择,方便用户查找和选择准确的信息。一个最常用的情景是选择供应商的地区和国家,例如有三个列表,一个是供应商所在的大洲,一个是国家,一个是供应商。当用户选择州的时候,会自动列出属于这个州的国家。避免用户迷失在大量的数据中。 这里展示一下如何在...

shrenk的专栏 7811

0009 用VisualStudio设计Max工具

这次分享个独家专利^)^:在Visual Studio中设计3dsMax脚本工具界面。 某次做原型设计时,需求改来改去,实在懒得搞GUI;虽然也尝试在Axure RP里画原型,但还是Visual Studio更顺手,也更容易测试一些交互,就直接在VS里做了。后来突发奇想,想实验一把能否直接用到Max里去,结果没想到成功了,效果还挺好。发现了新大陆,记录一下。   开始: 在VS里新建W...

whwst的专栏 769

代码随想录算法训练营第十五天|LeetCode110.平衡二叉树、LeetCode257.二叉树的所有路径、LeetCode404.左叶子之和、LeetCode222.完全二叉树的节点个数

打卡代码随想录算法训练营第49期第十五天o( ̄▽ ̄)d首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站。

tancxiaohei23的博客 553

Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇

Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇 文章目录Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇前言一、数据库的安装前准备,前提是没有安装过!!!二、仅安装数据库软件(数据库运行环境)三、添加数据库实例四、设置监听程序,让数据库可以通过网络访问五、为目标数据库设置网名总结 前言 如果需要安装包:联系我看到会给你链接,因为现在官网已经不提供10g,11g的安装包了,在网盘保存望悉知(回复不会很及时,下班看到会回复敬请谅解)。 提示:以下

zhx__的博客 5630

代码随想录算法训练营第十五天| 110 平衡二叉树、 257 二叉树的所有路径、404 左叶子之和、222 完全二叉树的节点个数

递归做多了以后,我经常在:1.不知道如何判断递归函数的返回值 2.不知道遍历的顺序如何选择,这两个上面出现问题。

m0_53877706的博客 461

SSD |(二)SSD主控

控制器作为一个片上系统,处理来自用户端的命令并负责管理闪存颗粒。

知识库搭建ing 1960

halcon第二讲:焊点提取

本文要完成的任务是将下图中焊点提取出来,对应于halcon例程Blob分析中的ball.hdev。 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) read_image (Image, 'die_03.png') disp_continue_message (WindowHandle, 'black', 'true') sto...

qq_24946843的博客 7175

代码随想录算法训练营第十五天| 222.完全二叉树的节点个数 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

入营第十五天难度:适中。

z542968z的博客 237

Ardupilot无人船(车)mavros自主控制

rover 4.4。

超维空间科技的博客 3229

代码随想录算法训练营第十五天| 110. 平衡二叉树、257. 二叉树的所有路径、 404.左叶子之和、222.完全二叉树的节点个数

目标:给你一棵二叉树,问它是不是的。“高度平衡”的官方定义是:对于树中的每一个节点,它的左右子树的高度差都不超过 1。所以这题不是只看根节点要平衡,是每一个节点都要平衡。

weixin_73559547的博客 750

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

代码随想录算法训练营第十五天| 222.完全二叉树的节点个数、110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

在这种情况下,不需要回溯是因为你通过不可变的字符串拼接方式实现了路径的构建,每次递归都生成了一个新的字符串对象,递归过程本身就确保了路径的独立性。相比之下,使用回溯的情况通常发生在路径或状态是可变对象(如数组或vector)时,需要在递归返回后恢复状态以继续其他路径的探索。这个方法的优点是代码更加简洁,避免了不必要的回溯操作,缺点可能是在涉及大量路径时,由于字符串拼接操作可能会带来一些性能开销。注意在函数定义的时候,定义的是,每次都是复制赋值,不用使用引用,否则就无法做到回溯的效果。

ncepuseu的博客 1114

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

代码随想录算法训练营第十五天|110平衡二叉树、257二叉树的所有路径、404左叶子之和、222完全二叉树的节点个数

递归的思路:将一个大任务拆分成模糊的小任务,模糊的小任务再次拆分成模糊的小任务,直到最后有一个具体的任务。

2302_80777118的博客 845

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

代码随想录算法训练营第十五天| 222.完全二叉树的节点个数 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

依然是对于二叉树遍历和递归函数的考察。之后在设计二叉树的递归函数时要注意尽可能在递归函数体内只操作当前结点,能一定程度上减小代码量,提高可读性。文章图片来源:代码随想录 (https://programmercarl.com/)

Mwicogito的博客 1044

代码随想录算法训练营第十五天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和, 222.完全二叉树的节点个数

方法三中path + '->'的使用,其实是由于path为str类型,在python中属于不可变类型,所以在传递到下一层改变了path,但是下一层的path会重新指向一个新的地址引用,而不是本层的path地址引用。方法二中path[:]的使用,其中[:]的使用只会拷贝path对象,而且是浅拷贝,所以递归到下一层的时候,就算更改了path,但是也并不会影响到本层的path对象。如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子。

懒羊羊在努力的博客 1033

代码随想录算法训练营第十五天|LeetCode 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

这篇依然是所有题目优先掌握递归。

Anastasia_sakura的博客 859

代码随想录算法训练营第十五天 | 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和、222. 完全二叉树的节点个数

文档讲解:https://programmercarl.com/0222.%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%8A%82%E7%82%B9%E4%B8%AA%E6%95%B0.html。文档讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html。

m0_45175414的博客 784

代码随想录算法训练营第十五天 |110. 平衡二叉树、257. 二叉树的所有路径 、404. 左叶子之和 、222. 完全二叉树的节点个数

给定一个二叉树,判断它是否是 平衡二叉树​true​falseroot = []true树中的节点数在范围[0, 5000]内。

m0_51795650的博客 1013

代码随想录算法训练营第十五天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

今日的题目都是用递归方法解决的,加深了对于递归的理解,并且在练习过程中有意识的先去想遍历顺序,然后按照递归三步曲解题,但是发现自己对于单次递归的逻辑还是不太能够很好的梳理出来,感觉还是有的绕,后边继续加强连续吧。

qq_39981702的博客 1103

代码随想录算法训练营第十五天|110平衡二叉树、257二叉树的所有路径 、404左叶子之和、222完全二叉树的节点个数

这样设计的原因是,一旦子树不平衡,后续的递归也没有必要继续判断,因此返回 -1 来直接传递不平衡的信息。要判断当前节点为根的子树是否平衡,关键在于左右子树高度差的绝对值是否超过 1。:在递归中,终止条件指的是在什么情况下可以直接返回结果,而不需要继续递归。的思想,它确保路径的正确性,避免混入多余节点。是否为空,因为在递归中已经确保了传入的节点不会是空节点。为 -1,表示左子树不平衡,直接返回 -1。为 -1,表示右子树不平衡,直接返回 -1。否则,返回以当前节点为根的子树的高度,即。

qq_43405634的博客 755

代码随想录算法训练营第十五天 | 二叉树 part03: 110.平衡二叉树、257. 二叉树的所有路径、 404.左叶子之和 、222.完全二叉树的节点个数

代码随想录算法训练营第十五天 | 二叉树 part03: 110.平衡二叉树、257. 二叉树的所有路径、 404.左叶子之和 、222.完全二叉树的节点个数

qq_52421969的博客 1237

代码随想录算法训练营第十五天|110.平衡二叉树 257. 二叉树的所有路径 404. 左叶子之和 222. 完全二叉树的节点个数

二叉树day3,目前主要是熟悉递归法使用

Ustianan的博客 1101

代码随想录算法训练营第十五天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

此题用迭代法,其实效率很低,因为没有很好的模拟回溯的过程,所以迭代法有很多重复的计算。虽然理论上所有的递归都可以用迭代来实现,但是有的场景难度可能比较大。例如:都知道回溯法其实就是递归,但是很少人用迭代的方式去实现回溯算法!因为对于回溯算法已经是非常复杂的递归了,如果再用迭代的话,就是自己给自己找麻烦,效率也并不一定高。求深度适合用前序遍历,而求高度适合用后序遍历。前序遍历,回溯,用一个int数组path记录路径,用string数字result记录结果,遇到叶子节点就终止递归,递归时要注意回溯。

xizhou_sean的博客 659
上一篇: 代码随想录算法训练营第十四天 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
下一篇: 代码随想录算法训练营第十六天 | 513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树
LIEBESFREUD
博客等级 码龄9年 372粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值