【代码随想录】【二叉树】day18:二叉树的左下角的值,路径总和、构造二叉树

news2024/9/23 1:40:51

1二叉树左下角的值

左下角的值:最后一层最左侧的节点的值

递归

from collections import deque
class TreeNode:
    def __init__(self,val,left=None,right=None):
        self.val = val
        self.left = left
        self.right = right

class solution:
    def leftBottomNode(self,root):
        self.maxdepth=0
        self.result=None
        self.travelsal(root,0)
        return self.result

    def travelsal(self,root:TreeNode,depth):
        # 终止条件:遍历到深度最大的节点了
        if root.left is None and root.right is None:
            if depth >self.maxdepth:
                self.maxdepth=depth
                self.result= root.val

        # 单层递归逻辑
        # 左 因为这里的return不在中,即没有处理中的逻辑,而我们需要记录递归时的深度,所以深度这个变量不是从上一层返回递增的,而是需要回溯
        if root.left:
            depth+=1
            self.travelsal(root.left,depth)
            depth-=1

        if root.right:
            depth+=1
            self.travelsal(root.right,depth)
            depth-=1

层序遍历

每层队列第一个popleft的值就是每层最左边的值,不断更新这个result找到左下角的值

   def leftBottomNode2(self,root):
        if root is not None:
            que=deque()
            que.append(root)
            result=0
            while len(que)>0:
                size=len(que)
                vec = []
                while size:
                    result=que.popleft().val
                    size-=1
                    if root.left:que.append(root.left)
                    if root.right:que.append(root.right)

2路径总和

代码随想录

第一种递归函数需要返回值的情况:力扣
在这里插入图片描述

该题在遍历过程中需要及时返回true 或者false以停止继续搜索

def findSumTree(self,root:TreeNode,count)->bool:
    # 终止条件 按照count--的做法
    if root is None:
        return False
    if root.left is None and root.right is None and count==0:
        return True
    if root.left is None and root.right is None and count!=0:
        return False

    if root.left:
        count-=root.left.val
        # 什么时候需要返回值,什么时候不需要返回值
        if (self.findSumTree(root.left,count)):
        # 递归时需要及时返回
            return True
        count+=root.left.val
    if root.right:
        count-=root.right.val
        if (self.findSumTree(root.right,count)):
            return True
        count+=root.right.val

第二种递归函数不需要返回值的情况:在这里插入图片描述

class solution2:
    def __init__(self):
        self.result=[]
        self.path=[]

    def findSumTree2(self,root:TreeNode,count)->bool:
        # 终止条件 按照count--的做法
        if root is None:
            return False
        if root.left is None and root.right is None and count==0:
            # Python里不写[:]代表的是传的是引用,会变,带上就是拷贝的结果,相当于快照
            self.result.append(self.path[:])
            return self.result

        if root.left is None and root.right is None and count!=0:
            return False

        if root.left:
            count-=root.left.val
            self.path.append(root.left.val)
            # 什么时候需要返回值,什么时候不需要返回值
            self.findSumTree2(root.left,count)
            count+=root.left.val  # 两次回溯
            self.path.pop()

        if root.right:
            count-=root.right.val
            self.path.append(root.right.val)
            self.findSumTree2(root.right,count)
            count+=root.right.val
            self.path.pop()

        return self.result

    def getSumTree(self,root,sum):
        if root is None:
            return 0
        self.path.append(root.val)
        return self.findSumTree2(root,sum-root.val)

3构造二叉树

中序和后序可以构造二叉树
中序和前序也可以构造二叉树
但是前序和后序不能构造二叉树,因为找不到根节点的位置

from typing import List
from collections import deque
class TreeNode:
    def __init__(self,val,left=None,right=None):
        self.val = val
        self.left = left
        self.right = right

class solution:
    # 中序和后序
    def createTree(self,inorder:List[int],postorder:List[int]):
        # 终止条件
        if len(inorder) == 0:
            return None

        # 先从后序数组里找中节点
        root = TreeNode(postorder[-1])
        # 然后找到中序数组里中节点的index
        index = inorder.index(root.val)
        # 确定中序数组的左子树和右子树
        inorder_left=inorder[:index]
        inorder_right=inorder[index+1:]
        # 然后递归处理左子树和右子树
        '''
        一定要保证递归的两个数组的长度是相同的
        '''
        root.left = self.createTree(inorder[:index],postorder[:len(inorder_left)])
        # 正常来讲 postorder应该从len(inorder_left)+1开始,但是要保证二者的长度相同,所以从len(inorder_left)开始
        root.right = self.createTree(inorder[index+1:],postorder[len(inorder_left):-1])
        return root


    def bulidTree(self,preorder,inorder):
        if len(preorder) == 0:
            return None

        # 从前序数组里找根节点
        root = TreeNode(preorder[0])
        index = inorder.index(root.val)
        '''
               一定要保证递归的两个数组的长度是相同的
               '''
        root.left = self.bulidTree(preorder[1:index+1],inorder[:index])
        root.right = self.bulidTree(preorder[index+1:],inorder[index+1:])
        return root
    def preorderPrint(self, root:TreeNode):
        if root is None:
            return []
        print(root.val)
        left=self.preorderPrint(root.left)
        right=self.preorderPrint(root.right)

    def travelsal(self,root:TreeNode):
        if root is not None:
            que=deque()
            que.append(root)
            result=[]
            # 一定是while,不是if
            while len(que)>0:
                size=len(que)
                vec = []
                while size:
                    root=que.popleft()
                    vec.append(root.val)
                    size-=1
                    if root.left:que.append(root.left)
                    if root.right:que.append(root.right)
                result.append(vec)
        return result

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

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

相关文章

【深度学习笔记】6_7 门控循环单元(GRU)

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 6.7 门控循环单元(GRU) 上一节介绍了循环神经网络中的梯度计算方法。我们发现,当时间步数较大或者…

[蓝桥杯 2020 省 B2] 平面切分

题目链接 [蓝桥杯 2020 省 B2] 平面切分 题目描述 平面上有 N N N 条直线, 其中第 i i i 条直线是 y A i ⋅ x B i y A_i \cdot x B_i yAi​⋅xBi​ 请计算这些直线将平面分成了几个部分。 输入格式 第一行包含一个整数 N N N。 以下 N N N 行, 每行包含两个整数…

总蛋白检测(Total Protein Assay)试剂盒--测定生物样品中胶原蛋白的含量

QuickZyme总胶原蛋白和羟脯氨酸检测试剂盒常用于测定生物样品(如组织、组织提取物、细胞提取物和培养基)中胶原蛋白的含量。为了正确解释所获得的数据,这些数据应该与一些参考量进行比较,如组织的湿重或干重、蛋白质含量与DNA等。…

2024蓝桥杯每日一题(二分)

一、第一题:教室 解题思路:二分差分 对天数进行二分,在ck函数中用差分方法优化多次区间累加。 【Python程序代码】 n,m map(int,input().split()) a [0] list(map(int,input().split())) d,s,t [0]*(m5),[0]*(m5),[0]*(m5) for…

VR全景在智慧园区中的应用

VR全景如今以及广泛的应用于生产制造业、零售、展厅、房产等领域,如今720云VR全景更是在智慧园区的建设中,以其独特的优势,发挥着越来越重要的作用。VR全景作为打造智慧园区的重要角色和呈现方式已经受到了越来越多智慧园区企业的选择和应用。…

adb常用指令集合

目录 1、查看应用Activity的任务栈2、局域网内无线连接设备3、启动adb服务4、结束adb服务5、查看连接的设备6、安装apk应用7、卸载指定应用8、从电脑拷贝文件到移动设备9、从移动设备拷贝文件到电脑10、重启设备11、查看版本12、调出shell,进入手机设置 1、查看应用…

最新:Selenium操作已经打开的Chrome(免登录)

最近重新尝试了一下,之前写的博客内容。重新捋了一下思路。 目的就是,selenium在需要登录的网站面前,可能就显得有些乏力,因此是不是有一种东西,可以操作它打开我们之前打开过的网站,这样就不用登录了。 …

python基础及网络爬虫

网络爬虫(Web crawler),有时候也叫网络蜘蛛(Web spider),是指这样一类程序——它们可以自动连接到互联网站点,并读取网页中的内容或者存放在网络上的各种信息,并按照某种策略对目标信息进行采集(如对某个网站的全部页面…

基于JavaWeb开发的springboot网咖管理系统[附源码]

基于JavaWeb开发的springboot网咖管理系统[附源码] 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &a…

修改AVD默认存放位置

一、背景 Android Studio安装完成后,通常会配置SDK和AVD,在配置SDK时,可以修改SDK位置,所以,安装完成后,SDK的位置已经进行了修改,但是AVD在创建时,没有修改路径,所以默…

视频监控/云存储EasyCVR视频融合平台设备增删改操作不生效是什么原因?

国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,平台支持7*24小时实时高清视频监控,能同时播放多路监控视频流&#xf…

【办公类-21-09】三级育婴师 视频转文字docx(等线小五单倍行距),批量改成“宋体小四、1.5倍行距、蓝色字体”

作品展示: 背景需求: 一、视频处理 1、育婴师培训的现场视频 2、下载视频,将视频换成考题名称 二、音频 视频用格式工厂转成MP3音频 3、转文字doc 把音频放入“网易云见外工作台”转换为“文字" 等待5分钟,音频文字会被写…

计算机组成原理-练手题集合【期末复习|考研复习】

前言 总结整理不易,希望大家点赞收藏。 给大家整理了一下计算机组成原理中的各章练手题,以供大家期末复习和考研复习的时候使用。 参考资料是王道的计算机组成原理和西电的计算机组成原理。 计算机组成原理系列文章传送门: 第一/二章 概述和数…

零基础小白也行,只用一行命令在自己的电脑跑大模型

什么是Ollama Ollama是一款免费开源的工具,拥有开箱即用的大模型,省去安装环境和下载模型的步骤,让零基础的人也能用起大模型。 项目地址 下载方法 通过下载链接可以找到对应的操作系统的下载版本,而且访问该网站不受限制&…

mysql 的一对一主从复制

一、配置主机 1、在主机mysql 配置文件my.cnf(位置一般在/etc/my.cnf) #在[mysqld]下面配置 #设置主机server-id(唯一) server-id1 #开启binlog文件 bin-log/var/lib/mysql/mysqlbin2、添加授权账号 #格式旧版 #GRANT REPLICATION SLAVE ON *.* TO sl…

个人博客网站前端页面的实现

博客网站前端页面的实现 博客登录页 相关代码 login.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

【数学】【网格】【状态压缩】782 变为棋盘

作者推荐 视频算法专题 本文涉及知识点 数学 网格 状态压缩 LeetCode:782 变为棋盘 一个 n x n 的二维网络 board 仅由 0 和 1 组成 。每次移动&#xff0c;你能任意交换两列或是两行的位置。 返回 将这个矩阵变为 “棋盘” 所需的最小移动次数 。如果不存在可行的变换&am…

PWARL CTF and others

title: 一些复杂点的题目 date: 2024-03-09 16:05:24 tags: CTF 2024年3月9日 今日习题完成&#xff1a; 1.BUU [网鼎杯 2020 半决赛]AliceWebsite 2.[RoarCTF 2019]Online Proxy 3.[Polar CTF]到底给不给flag呢 4.网鼎杯 2020 总决赛]Game Exp [RoarCTF 2019]Online Proxy …

微信小程序云开发教程——墨刀原型工具入门(常用组件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

初学SpringBoot——请求响应

0 引言 我们在使用SpringBoot开发Java后端项目时候&#xff0c;需要响应前端发送过来的请求&#xff0c;那后端如何响应前端的请求呢&#xff1f;以及前端发送那么多的请求&#xff0c;后端如何根据不同的请求执行不同的代码呢&#xff1f; 1 Postman 当前&#xff0c;主流的…