【代码随想录17】平衡二叉树

news2024/11/23 12:01:51

题目

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

思路

定义一个方法计算给定root的树高度,注意区分二叉树节点的高度和二叉树节点的深度区别!

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

接下来写isBalanced方法,使用递归三部曲:

  1. 确定返回类型:布尔类型,True or False
  2. 递归出口:如果根为空 或者 根的左右子树都为平衡二叉树且左右子树高度差不超过1,返回True,否则返回False
  3. 每一层递归逻辑:先调用isBalanced方法递归判断左右子树是否都为平衡二叉树,再求一下左右子树的高度,如果根的左右子树都为平衡二叉树且左右子树高度差不超过1,返回True,否则返回False
# 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 getHeight(self,root):
        if not root:
            return 0
        return max(self.getHeight(root.left),self.getHeight(root.right))+1

    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        left = self.isBalanced(root.left)
        right = self.isBalanced(root.right)
        left_h = self.getHeight(root.left)
        right_h = self.getHeight(root.right)
        if left and right and abs(left_h-right_h)<=1:
            return True
        else:
            return False

其实上面的写法并不高效,因为我们如果找到判断完root节点的左右子树是否为平衡二叉树之后,紧接着就去求左右子树的高度,但是如果它的左右子树都不是平衡二叉树,就没必要再求树高了。实际上求树高也占了不少时间,所以直接返回False能高效很多。

# 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 getHeight(self,root):
        if not root:
            return 0
        return max(self.getHeight(root.left),self.getHeight(root.right))+1

    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        left = self.isBalanced(root.left)
        right = self.isBalanced(root.right)
        if not left or not right:
            return False
        left_h = self.getHeight(root.left)
        right_h = self.getHeight(root.right)
        if abs(left_h-right_h)<=1:
            return True
        else:
            return False

看一下时间差距

实际上这样效率还是有点低,因为我们是把判断二叉树是否为平衡二叉树的逻辑和树高分开去求了,但是求树高的同时可以顺便判断一下当前数是否为平衡二叉树,这样效率又可以提升。

# 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 getHeight(self,root):
        if not root:
            return 0
        left = self.getHeight(root.left)
        if left==-1:
            return -1
        right = self.getHeight(root.right)
        if right==-1:
            return -1
        if abs(left-right)>1:
            return -1
        return -1 if abs(left-right)>1 else max(left,right)+1

    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        return self.getHeight(root)!=-1

 

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

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

相关文章

数学建模-时间序列分析 实例

实例1销量数据预测和实例2人口数据预测实例3上证指数预测和实例4gdp增长率预测 数据-定义时间 不加置信区间清晰点 例二 实例3

Java实现获取客户端真实IP方法小结

Java实现获取客户端真实IP方法小结 在jsP里&#xff0c;获取客户端的IP地址的方法是&#xff1a;request.getRemoteAddr()&#xff0c;这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件&am…

tp6 实现excel 导入功能

在项目根目录安装 composer require phpoffice/phpspreadsheet 我们看一下郊果图&#xff0c;如下 点击导入excel表格数据 出现弹窗选择文件&#xff0c;控制台打开输出文档内容 前端layui代码 <form id"uploadForm" class"form-horizontal" encty…

Vmware+CentOS+KGDB内核双机调试

1.准备两台CentOS系统的vmware虚拟机 其中一台作为调试机&#xff0c;另一台则作为被调试机。如下图&#xff0c;CentOS7.9x64为被调试机&#xff0c;CentOS7.9x64-Debugger为调试机 2.配置串口设备 若虚拟机有串口设备&#xff08;如打印机&#xff09;&#xff0c;需要先删…

数据仓库设计理论

数据仓库设计理论 一、数据仓库基本概念 1.1、数据仓库介绍 数据仓库是一个用于集成、存储和分析大量结构化和非结构化数据的中心化数据存储系统。它旨在支持企业的决策制定和业务分析活动。 1.2、基本特征 主题导向&#xff1a;数据仓库围绕特定的主题或业务领域进行建模…

vscode设置java -Xmx最大堆内存

如果在vscode中直接运行java程序&#xff0c;想要改下每次运行的最大堆内存&#xff0c;按照如下修改 一、vscode安装java插件 当然前提是vscode在应用管理中已经安装了java语言的插件&#xff0c;Debugger for Java,如下图所示 二、CommandShiftP打开配置搜索框 三、搜索…

PCL+C++点云窗体显示实例

程序示例精选 PCLC点云窗体显示实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PCLC点云窗体显示实例>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 …

深度剖析数据在内存中的存储——C语言进阶

目录 一、数据类型介绍 1.1 整型家族 1.2 浮点型家族 1.3 构造类型 二、整型在内存中的存储 2.1 原码、反码、补码 2.2 大小端字节序 大小端存储的定义 为什么会有大小端字节序之分呢&#xff1f; 怎么判断一个当前机器的大小端 2.3 有符号和无符号的区别 三、浮点型…

网络安全秋招面试题+(含答案)

自我介绍 有没有挖过src&#xff1f; 平时web渗透怎么学的&#xff0c;有实战吗&#xff1f;有过成功发现漏洞的经历吗&#xff1f; 做web渗透时接触过哪些工具 xxe漏洞是什么&#xff1f;ssrf是什么&#xff1f; 打ctf的时候负责什么方向的题 为什么要搞信息安全&#xff0c;对…

人工智能在教育上的应用1-基于pytorch框架下模型训练,用于数学题目图形的智能分类

大家好&#xff0c;今天给大家介绍一下人工智能在教育上的应用1-基于pytorch框架下模型训练&#xff0c;用于数学题目图形的智能分类&#xff0c;本文将利用CNN算法对数学题目中的图形进行自动分类和识别。这种应用可以帮助学生更好地理解和解决与数学相关的问题。基于CNN的数学…

C++平衡搜索二叉树(AVL)

一、定义 AVL树本质上还是一棵二叉搜索树&#xff0c;它的特点是&#xff1a; 1.本身首先是一棵二叉搜索树。 2.带有平衡条件&#xff1a;每个结点的左右子树的高度之差的绝对值&#xff08;平衡因子&#xff09;最多为1。 搜索二叉树可能出现单边树的情况&#xff0c;导致…

JavaWeb 速通HTTP

目录 一、HTTP快速入门 1.HTTP简介 : 2.HTTP请求头 : 3.HTTP响应头 : 二、HTTP响应状态码 1.基本介绍 : 2.常见状态码 : 3.状态码的分类 : 4.完整状态码汇总 : 三、HTTP请求包和响应包 1.请求包分析 : 1 GET请求 (1) 说明 (2) doGet返回数据给浏览器 (3) form表单提…

网络安全合规与标准的主要发展方向

网络安全合规就是避免违反网络安全有关的法律、法规、规章、合同义务以及任何安全要求&#xff0c;标准在网络安全合规工作中扮演着重要的角色。 一、标准在网络安全合规体系中的地位作用 网络安全合规体系包括网络安全有关的法律、法规、规章、其他规范性文件、及合同义务等…

JavaWeb课程设计项目实战(07)——项目编码实践4

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 在本节教程中&#xff0c;我们实现删除学生的功能。当在学生列表中点击删除后即可删除某位学生并重新加载学生列表。所以&#xff0c;该操作实际包含两步&#xff1a; 1、删…

Java虚拟机——虚拟机字节码执行引擎 运行时栈帧结构

1 虚拟机字节码执行引擎 执行引擎是Java虚拟机核心的组成部分之一。"虚拟机"是一个相对于"物理机"的概念&#xff0c;这两种机器都有代码执行的能力&#xff0c;物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的。而虚拟机的执行引擎…

unity 调用c++ dll同时将unity的值传给c++

最近因为项目的需要&#xff0c;实现了将C工程生成dll在unity中调用&#xff0c;但同时发现如果能让unity中值实时的传给c则就完美了&#xff0c;而不只是把c计算的结果给unity。 通过验证是可行的。 C 生成dll导出关键部分 // SPDX-License-Identifier: MIT // Copyright (c…

单Bank OTA升级:STM32G071 BootLoader (一)

什么是单Bank升级&#xff1a;将Flash划分为以下3个区域。 BootLoader区&#xff1a;程序进行升级的引导程序&#xff0c;根据Upade_Flag来判断跳转Bank区运行程序或是接收升级数据写入Bank&#xff0c;接收完成后擦写Upade_Flag区&#xff0c;进行跳转Bank区运行程序。 Upad…

无线投屏手机(安卓)屏幕到 Linux(ubuntu 22.04)桌面

1.安装 scrcpy 安装 scrcpy会自动安装 adb. 这个版本的adb功能不是最全的&#xff0c;需要删掉&#xff0c;然后从链接 https://dl.google.com/android/repository/platform-tools-latest-darwin.zip 下载&#xff0c;解压安装即可。 2. 在手机上 打开开发者模式和 USB调试…

Git Merge和Rebase

◆ 前言 Git作为我们日常开发代码的版本管理&#xff0c;开发分支的管理方面起着很大作用&#xff0c;我们开发过程中分支通常有生产、预发、测试、开发这几个分支&#xff0c;我们会根据项目进行的某个阶段&#xff0c;将代码提交到某个版本上&#xff0c;正常流程是先开发 —…

【并发专题】阻塞队列BlockingQueue实战及其原理分析

目录 前置知识队列有界队列、无界队列Queue——队列在JAVA里面的接口 阻塞队列介绍BlockingQueue——阻塞队列在JAVA里面的接口阻塞队列的应用场景JUC包下的阻塞队列 课程内容*一、ArrayBlockingQueue基本介绍应用场景使用示例基本原理数据结构核心源码解析双指针与环形数组 *二…