[Leetcode] 二叉树的深度、平衡二叉树

news2025/1/10 17:58:34

题目链接:

二叉树的最大深度 https://leetcode.cn/problems/maximum-depth-of-binary-tree/submissions/

二叉树的最小深度 https://leetcode.cn/problems/minimum-depth-of-binary-tree/

平衡二叉树 https://leetcode.cn/problems/balanced-binary-tree

1.二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:

输入: [3,9,20,null,null,15,7]

3

/ \

9 20

/ \

15 7

输出: 3

1.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 maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        elif not root.left and not root.right:
            return 1
        else:
            return max(self.maxDepth(root.left),self.maxDepth(root.right)) + 1

1.2 广度优先搜索

分析:层序遍历二叉树,结束一层并存好下一层(如果有)的节点后,深度加一

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        q = [root]
        height = 0
        while q:
            currentSize = len(q)
            for i in range(currentSize):
                node = q.pop(0)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
            height += 1
        return height

2.二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

示例 :

输入:root = [3,9,20,null,null,15,7]

3

/ \

9 20

/ \

15 7

输出:2

2.1 深度优先搜索

分析:使用递归,不断找出每个节点左子树和右子树的最小深度,取较小者,每轮递归深度加一

如果直接比较左右子树高度,注意排除左右子树高度为0,即不存在的情况,例如以下这种树

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        elif not root.left and not root.right:
            return 1
        else:
            depthL = self.minDepth(root.left)
            depthR = self.minDepth(root.right)
            return min(depthL,depthR) + 1 if min(depthL,depthR) != 0 else max(depthL,depthR) + 1

如果依次判断左右子节点是否存在,然后取较小者,初始可以设置一个大数作为比较基准

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        elif not root.left and not root.right:
            return 1
        else:
            minDepth = 10**9
            if root.left:
                minDepth = min(self.minDepth(root.left),minDepth)
            if root.right:
                minDepth = min(self.minDepth(root.right),minDepth)
            return minDepth + 1

2.2 广度优先搜索

分析:层序遍历二叉树,如果当前层的节点没有左右子节点,说明它是叶子节点,停下来,返回该层的深度;否则,结束一层并存好下一层(如果有)的节点后,深度加一

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        q = [root]
        height = 0
        #判断左右子树是否存在
        existL = 0
        existR = 0
        while q:
            currentSize = len(q)
            for i in range(currentSize):
                node = q.pop(0)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
                if not node.left and not node.right:
                    return height+1
            height += 1
            
        return height

3. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

3.1 自顶向下递归

自顶向下地递归地判断左子树和右子树的深度差,一旦大于1就返回False

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        depth = 0
        if not root:
            return 0
        elif not root.left and not root.right:
            return 1
        else:
            return max(self.maxDepth(root.left),self.maxDepth(root.right)) + 1

    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        elif not root.left and not root.right:
            return True
        else:
            depthL = self.maxDepth(root.left)
            depthR = self.maxDepth(root.right)
            if abs(depthL-depthR) > 1:
                return False
            else:
                return self.isBalanced(root.left) and self.isBalanced(root.right)

3.2 自底向上递归

用列表设置一个标志(也可以使用global或nonlocal),初始为True,代表是否平衡二叉树

在找最大深度的过程中判断左子树和右子树的深度差是否大于1,大于1则不平衡返回-1同时修改标志

class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        flag = [True]
        def maxDepth(root):
            if not root:
                return 0
            depthL = maxDepth(root.left)
            depthR = maxDepth(root.right)
            deltaDepth = abs(depthL-depthR)
            if deltaDepth > 1:
                flag[0] = False
                return -1
            return max(depthL,depthR) + 1
        maxDepth(root)
        return flag[0]

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

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

相关文章

微信小程序实现上下左右滑动触发联动选项卡、绝对值、事件、parse、stringify、Math、atan、abs、findIndex

文章目录序言1、HTML部分2、JavaScript部分(上下左右滑动均触发)3、JavaScript部分(左右滑动触发)4、效果演示序言 最近在写原生微信小程序项目的时候遇到了左右滑动内容更新数据,同时改变tabBar的高亮效果。于是就写了…

B. Camp Schedule(KMPnext数组)

Problem - 1137B - Codeforces 在全国范围内广为人知的春季编程训练营即将开始。因此,所有友好的策展人和教师团队开始组成营地的时间表。经过不断的讨论,他们想出了一个时间表,可以表示为一个二进制字符串,其中第i个符号是 "…

前后端的身份认证

1、Web 开发模式 目前主流的 Web 开发模式有两种,分别是: 基于服务端渲染的传统 Web 开发模式基于前后端分离的新型 Web 开发模式 1.1、服务端渲染的 Web 开发模式 服务端渲染的概念:服务器发送给客户端的 HTML 页面,是在服务器…

【Linux】进程间通信(万字详解) —— 下篇

🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…

我的周刊(第073期)

我的信息周刊,记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。🎯 项目zlib-searcher[1]zlib 开源搜索方案(zli…

基于朴素贝叶斯算法的激光雷达点云分类

前言激光雷达技术是一种采集三维数据的、重建三维模型的手段,运用在各个行业,随着激光雷达技术的发展与广泛运用本文采用监督分类中的朴素贝叶斯算法进行地基于激光雷达的地物分类。首先根据点云的几何位置建立邻域范围,借助邻域点的集合计算…

分享98个PHP源码,总有一款适合您

PHP源码 分享98个PHP源码,总有一款适合您 PHP源码下载链接:https://pan.baidu.com/s/1ZNcdj0bLY51UXNoXq8tgFg?pwdwn4b 提取码:wn4b 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...&#xff0…

ORB-SLAM2 --- LoopClosing::ComputeSim3 函数

目录 1.什么是sim3,为什么要做sim3 2.函数流程 3.code 4.函数解析 4.1 准备工作 4.2 遍历闭环候选帧集,初步筛选出与当前关键帧的匹配特征点数大于20的候选帧集合,并为每一个候选帧构造一个Sim3Solver 4.3 对每一个候选帧用Sim3Sol…

实例分析Linux内存泄漏检测方法

一、mtrace分析内存泄露 mtrace(memory trace),是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题。它的实现源码在glibc源码的malloc目录下,其基本设计原理为设计一个函数 void mtrace ()&#x…

解决Tinkphp的success跳转“使用路由别名后模块和路由器访问不了”问题

遇到的问题:我的thinkphp5网站添加了以下路由别名:Route::alias([ index>index/index, ]);使用http://域名/Index/user/password.html访问正常但使用http://域名/index/user/password.html就访问失败使用$this->success(修改密码成功);进行提示跳转…

Java 链表与LinkedList

链表的组合形式 ①有头结点、无头结点 ②单向链表、双向链表 ③循环链表、非循环链表 根据自由组合,可以得到8种不同形式的链表,那么在刷题种常碰到的是不带有头结点的单向非循环链表和不带头结点的双向非循环链表。 模拟实现不带头结点的单向非循环链表…

Notes可以手动签名了

大家好,才是真的好。 Notes/Domino 12.0.2陆续有人下载测试了,关于Notes的新功能中,我们上一篇也介绍到了可以手动签名。 字面上的意思,就是你可以调出手写板,然后使用触屏或鼠标来进行签名,可以在Nomad …

javaEE 初阶 — 定时器

文章目录定时器1 什么是定时器2 标准库中定时器3 实现一个定时器3.1 实现的思路3.2 为什么要使用优先级队列来保存任务3.3 开始实现定时器 1 什么是定时器 定时器 类似于一个 “闹钟”,达到一个设定的时间之后,就执行某个指定好的代码。 定时器是一种实…

印染行业APS智能排程排产的应用意义

不得不说的印染之“痛” 在印染行业,因排产无法自动化、智能化,企业在交期、成本、生产管理方面承受着巨大的压力,尤其当下印染企业生产管理正从传统的粗放式转向精细化,这些痛点愈加凸显。 一方面,客户和企业面临一个…

httpd安装

一、离线安装 1、去 https://pkgs.org/ 下载httpd所依赖的7个rpm包 [基于CentOS 7 x86_64系统,如需其他环境可前往官网直接下载] apr-1.4.8-5.el7.x86_64.rpm apr-util-1.5.2-6.el7.x86_64.rpm apr-util-ldap-1.5.2-6.el7.x86_64.rpm postgresql-libs-9.2.24-1.el…

互联互通-标准化成熟度指标分析(未完成)

整体分析1 医疗机构基本情况2 数据资源标准化建设情况(30 分)2.1数据集标准化情况(15 分)2.1.1电子病历基本数据集 第1部分:病历概要(1-4数据集)2.1.2电子病历基本数据集 第2部分:门…

Jetpack Compose UI创建布局绘制流程+原理 —— 内含概念详解(手撕源码)

本文是我去年首发于稀土掘金平台的文章 全文较长:共1万5千字,适合有耐心❤️的人学习 有些概念不懂的可以去4.部分概念详解这个目录先稍微学习一下 Compose源码基于最新的Compose 版本:1.0.1 系统源码基于最新的Android11 版本 注意&#xff…

【蓝桥杯基础题】2020年省赛填空题—回文日期

👑专栏内容:蓝桥杯刷题⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录一、题目背景二、题目描述1.问题描述2.输入格式3.输出格式4.一个例子5. 评测用例规模与约定三、题目分析1.获取位数2.回文…

236页10万字精选数据中台建设方案2022版

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容: 目录 1. 数据中台平台建设方案 …

数据存储大小端 网络字节序

一、概念 大端模式:数据的低位存放在内存的高地址中 小端模式:数据的低位存放在内存的低地址中 二、数据的高低位 首先需要清楚一段数据存储高低位区分 联想记忆最右边为16^0 下来16^1 比如下图二进制为例: 三、内存的高低位 以vs2019为…