力扣算题Day17

news2025/2/23 5:59:49

110.平衡二叉树(递归很难理解,思维很重要)

        下面才是做二叉树的一种正确思维:

        copy他人运行代码:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:

    def judgeDepth(self, root):
        # 节点为空,高度为 0
        if root == None:
            return 0
        # 递归计算左子树的最大高度
        leftHeight = self.judgeDepth(root.left)
        #  如果左子树不是平衡二叉树,肯定不是平衡二叉树
        if leftHeight == -1:
            return -1;
        # 递归计算右子树的最大高度
        rightHeight = self.judgeDepth(root.right)
        # 如果右子树不是平衡二叉树,肯定不是平衡二叉树
        if rightHeight == -1:
            return -1;
        # 若为平衡二叉树,平衡因子为 1、0、-1
        if abs(leftHeight - rightHeight) > 1:
            return -1
        else:
            # 二叉树的最大高度 = 子树的最大高度 + 1(1 是根节点)
            return max(leftHeight, rightHeight) + 1

    def isBalanced(self, root: TreeNode) -> bool:
        if self.judgeDepth(root) != -1:
            return True
        return False

         自己看懂后,手撕运行代码:

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: TreeNode) -> bool:
        if self.judge(root)==-1:
            return False
        else:
            return True



    def judge(self,root):
        if root==None:
            return 0
        left_height=self.judge(root.left)
        if left_height==-1:
            return -1
        right_height=self.judge(root.right)
        if right_height==-1:
            return  -1
        if abs(left_height-right_height)>1:
            return -1
        else:
            return 1+max(left_height,right_height)

 257. 二叉树的所有路径 (有一个隐藏回溯)

         模仿运行代码:

404.左叶子之和 

copy代码:

class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        if not root:
            return 0

        left_left_leaves_sum = self.sumOfLeftLeaves(root.left)  # 左
        
        right_left_leaves_sum = self.sumOfLeftLeaves(root.right)  # 右
        
        cur_left_leaf_val = 0
        if root.left and not root.left.left and not root.left.right:
            cur_left_leaf_val = root.left.val


       

        return cur_left_leaf_val + left_left_leaves_sum + right_left_leaves_sum  # 中

方法1(中序遍历)debug代码:

class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        if not root:
            return 0
        # print(root.left)
        print(root.val)

        left_left_leaves_sum = self.sumOfLeftLeaves(root.left)# 左
        print(root.val)
        if root.left and not root.left.left and not root.left.right:
            left_left_leaves_sum= root.left.val
        print(f"{root.val}+left", left_left_leaves_sum)
        # print(root.val)

        right_left_leaves_sum = self.sumOfLeftLeaves(root.right)  # 右
        print(root.val)

        print(f"{root.val}+right",right_left_leaves_sum )
        uu=left_left_leaves_sum + right_left_leaves_sum
        print(f"{root.val}+中",uu)

        return   uu # 中

Debug运行逻辑:

        每个节点都要return uu(下图中红框)

 

方法2(后续遍历)Debug:

class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        if not root:
            return 0#高度为0
        print(root.val)
        left_sum=self.sumOfLeftLeaves(root.left)
        print(f"{root.val}+left", left_sum)

        right_sum=self.sumOfLeftLeaves(root.right)
        print(f"{root.val}+right", right_sum)
        fff=0
        if root.left and not root.left.left and not root.left.right:
            fff=root.left.val
        print(f"{root.val}+ff", fff)
        uu=fff+right_sum+left_sum
        print(f"uu+{fff}+{left_sum}+{right_sum}",uu)
        return uu

力扣方法3(前序遍历):

class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        if not root:
            return 0#高度为0
        fff = 0
        if root.left and not root.left.left and not root.left.right:
            fff=root.left.val
        print(root.val)
        left_sum=self.sumOfLeftLeaves(root.left)
        print(f"{root.val}+left", left_sum)

        right_sum=self.sumOfLeftLeaves(root.right)
        print(f"{root.val}+right", right_sum)


        print(f"{root.val}+ff", fff)
        uu=fff+right_sum+left_sum
        print(f"uu+{fff}+{left_sum}+{right_sum}",uu)
        return uu

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/507196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自底向上分析概述

4-8自底向上的分析概述_哔哩哔哩_bilibili (开始准备期末考试)(可菜) 移入-规约分析: 每次归约的符号串称为“句柄”,一旦句柄在栈顶形成,我们立即将它规约,因此每一步规约都是最左…

[JAVA EE]创建Servlet——继承HttpServlet类笔记2

创建Servlet的方式之一:继承HttpServlet类(经常使用) 如果请求方式为get请求则调用doGet()方法; 如果请求方式为post请求则调用doPost()方法。 开发中通常不会在两个方法中写重复的代码,会造成代码冗余。 Request 一、获取请求…

[前端基础]websocket协议

(1)websocket websocket(简写为ws),是一种轻量化的协议,经过最开始的握手阶段以后,前后端之间允许自由地发送信息不受限制(建议发送json字符串).虽然理论上这个东西是属于协议内容,但是已经被疯狂封装得像框架一样了. websocket协议具有天然的优势处理前端多线程并发,并且只需…

Android---Glide的基本使用

目录 Glide 基本使用 Glide 进阶 Glide 是一个快速高效的 Android 图片加载库,可以自动加载网络、本地文件,app 资源中的图片,注重于平滑的滚动。 Glide 第一次加载一张图片后,就会自动帮我们把这张图片加入到内存中进行管理。…

Linux内核同步之RCU机制基础

Why RCU 1. 中断与抢占 当一个进程被时钟中断打断后,kernel运行tick中断处理程序(一般是top half),中断处理程序运行结束后,有两种情况: 之前的进程获得CPU继续运行。 另一个进程获得了CPU开始运行&…

AI智慧安监:打电话/玩手机智能检测,构筑安全生产新防线

1、方案背景 在油库、加油站、化工厂等场景中,安全生产是首要的监管问题,因为有易燃物品的存放,打电话很容易引起火灾爆炸等安全事故,造成巨大的生命和财产损失。因此,对人员行为的监管是安全的关键,在一些…

计算机图形学 | 实验六:旋转立方体

计算机图形学 | 实验六:旋转立方体 计算机图形学 | 实验六:旋转立方体Z-缓冲GLM函数库PVM矩阵PVM矩阵的使用 华中科技大学《计算机图形学》课程 MOOC地址:计算机图形学(HUST) 计算机图形学 | 实验六:旋转…

怎么看待QA(软件测试)漏测bug?

先抛出我的2个观点: 1、漏测不一定是测试的锅。但当问题发生时,测试第一时间不要去拒绝推卸责任,而是要先去解决漏测问题。 2、漏测问题的及时处理很重要,但是避免再次漏测更重要。 为了将此问题阐述的更清楚,我将通过…

SSM框架学习-DI依赖注入方式实例

DI依赖注入:依赖注入(Dependency Injection, DI)是一种设计模式,用于将一个对象所需要的其他对象的引用或依赖关系从代码中解耦出来,将其交由某个第三方来管理,使得对象本身更加独立,便于测试和…

使用读写锁提高并发

我们想要的是:允许多个线程同时读,但只要有一个线程在写,其他线程就必须等待。 ReadWriteLock ReadWriteLock的作用: 只允许一个线程写入(其他线程既不能写入也不能读取);没有写入时&#xf…

基于深度学习的三维重建网络PatchMatchNet(三):如何利用patchmatchnet完成自己场景的数据集制作与利用自己的数据完成三维重建工作

目录 1.如何使用本篇博客 1.1 patchmatchnet网络环境配置 1.2 colmap环境配置 2.如何利用colmap制作自己的三维重建数据集 2.1 采集数据 2.2 使用colmap计算位姿 2.3 转换位姿到MVS读取的格式 2.4 剔除离群图片 2.5 运用patchmatchnet进行三维重建 1.如何使用本篇博客 …

【MySQL】简单使用

数据库:文件,管理系统 类别:关系型,非关系型(nosql) C/S模式(客户端服务器) mysql登录 用户名&密码 默认管理员:root 登录:Linux管理员身份运行客户…

为什么二极管具有单向导通性

大家都知道二极管具有单向导通性,比如一个双极性的信号通过二极管后会变成一个单极性的信号。 为了弄清这个问题先来看一下二极管的构成。 在纯净的硅晶体中掺入五价元素,比如磷,就形成了N型半导体,掺入的五价元素多余的电子很容…

汉明码简单计算方法

正算 看一张图 其中标绿底色的为汉明码校验位,可以发现,这些位置的2进制里面只有一个1,其他位上都是0。 先说结论:校验位上的1在第几个位上,就会用来保证位置的2进制里面该位上为1的位置上的1的个数为偶数。 比如&…

11_Uboot启动流程_3

目录 run_main_loop函数详解 cli_loop函数详解 cmd_process函数详解 run_main_loop函数详解 uboot启动以后会进入3秒倒计时,如果在3秒倒计时结束之前按下按下回车键,那么就,会进入uboot的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动Linux内核,这个功能…

MySQ ---- 函数

函数 函数是指一段可以直接被另一段程序调用的程序或代码。MySQL 内置了很多函数,开发人员只需要调用使用即可。查询语句中已经使用过了一些聚合函数。下面还有些常用的函数需要掌握。 函数应用场景举例 函数的分类 ① 字符串函数 ② 数值函数 ③ 日期函数 ④ 流程…

chap和ppp认证配置+MGRE实验

题目要求 1.R2为ISP,其上只能配置IP地址 2.R1-R2之间为HDLC封装 3.R2-R3之间为ppp封装,pap认证,R2为主认证方 4.R2-R4之间为ppp封装,chap认证,R2为主认证方 5.R1,R2,R3构建MGRE环境,仅R1的IP地址固定 6.内…

OpenPCDet系列 | 4.KITTI数据集数据加载流程代码解析

文章目录 数据加载流程0. create_kitti_infos1. __getitem__函数2. prepare_data函数3. collate_batch函数数据加载流程 这里记录一下具体用到的那些数据形式,整个kitti数据集的处理框架图如下所示: 在数据集处理到获取一个batch数据的整个流程的入口如下: # 开始迭代每…

STL常用容器

目录 一、string容器 1、基本概念 2、构造函数 3、赋值操作 4、字符串拼接 5、查找和替换 6、字符串比较 7、字符存取 8、插入与删除 9、获取字串 二、vector容器 1、基本概念 2、构造函数 3、赋值操作 4、容量和大小 5、插入和删除 6、数据存取 7、互换容器…

hadoop shell操作HDFS文件

一.常用的 hadoop shell 文件路径需要自己有才行,示例中的文件路径是本人自己的文件路径,不是公共文件路径,如何建立自己的数仓,查看本人 大数据单机学习环境搭建 相关文章 1.1查看 创建 删除 # 列出当前hdfs所存贮的文件 hado…