python解决如何判断平衡二叉树问题

对于二叉树中的特殊二叉树,平衡二叉树,要想解决判断二叉树是否是平衡二叉树问题,首先需要知道什么事平衡二叉树。

平衡二叉树的概念是指给定一颗二叉树,这颗二叉树以及二叉树的所有子二叉树的左右子树的高度之差不大于1,则这棵二叉树便是平衡二叉树。

对于如何判断是否是平衡二叉树,可以使用两种方法来进行判断,一种方法是使用自顶向下的方法,另一种是采用自下而上的方法,对于这两种方法都进行一个详细的讲解。

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

以上给定的两个二叉树,第一个是平衡二叉树,第二个不是平衡二叉树。

首先是自顶向下的方法,这里会使用到求二叉树的最大深度来进行辅助判断;对于平衡二叉树,它的左右子树的高度之差不大于1,同时还保证这颗二叉树的所有子树都是平衡二叉树,也就可以保证这颗二叉树本身使平衡二叉树,使用求最大深度的方式来直接判断左右子树的高度之差。

该方法的实现主要是将二叉树的根节点root传入主调函数中,主调函数的终止条件是如果该节点为空节点,即结束并且返回的是该二叉数是平衡二叉树的结果,而如果该节点不是空,则会有三个判断并集,分别是判断左子树是否是平衡二叉树、右子树是否是平衡二叉树、节点的左右子树高度差是否小于等于1。代码实现如下:

def balance(root):if not root:return Truereturn balance(root.left) and balance(root.right) and abs(maxDepth(root.left)-maxDepth(root.right))<=1
def maxDepth(root):if root:return 0else:return max(maxDepth(root.left),maxDepth(root.right))+1

对如上的方法可以看出,整个过程还是较为简洁明了的,但是能够看出这里面有很多的重复运算,而且随着数据量的提升,问题规模逐渐增大,则整个过程中的重复计算会越来越多,就会导致效率的逐渐降低。下图中可以看到maxDepth函数执行了多次。

添加图片注释,不超过 140 字(可选)

针对自上而下的重复计算,可以使用自下而上的方式啦进行优化,对于每一棵树,如果计算左子树和右子树的高度的时候,当发现做优子树的高度差不大于1的时候,就向上层返回左右子树的最大高度值加一,而当发现任何一颗子树是不平衡的子树的时候,就向上层返回-1,这样可以避免重复运算,使因为可以通过返回-1的方式来及时的反映出子树已经是不平衡子树了,那给定的树就不可能是平衡树了,直接终止继续计算。其python代码实现如下:

def balance(root):if dfs(root)==-1:return Falsereturn True
def dfs(root):if not root:return 0left=dfs(root.left)if left==-1:return -1right=dfs(root.right)if right==-1:return -1return max(left,right)+1 if abs(left - right) < 2 else -1

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

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

相关文章

redis的搭建及应用(六)-redis应用LUA脚本

edis的lua脚本 Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放&#xff0c; 其设计目的是为了嵌入应用程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。 Lua 是巴西里约热内卢天主教大学&#xff08;Pontifical Catholic University …

STM32 IAP学习

STM32三种烧录方式 ISP&#xff1a;In System Programming&#xff08;在系统编程&#xff09; 执行芯片厂商的BootLoader程序进入ISP模式&#xff0c;进入ISP模式后&#xff0c;用户可选择官方提供的烧录通信接口&#xff08;如&#xff1a;串口&#xff09;&#xff0c;并配…

C++ UTF-8与GBK字符的转换 —基于Windows (MultiByteToWideChar WideCharToMultiByte)

1、UTF-8 和 GBK 的区别 GBK&#xff1a;通常简称 GB &#xff08;“国标”汉语拼音首字母&#xff09;&#xff0c;GBK 包含全部中文字符。 UTF-8 &#xff1a;是一种国际化的编码方式&#xff0c;包含了世界上大部分的语种文字&#xff08;简体中文字、繁体中文字、英文、…

word2019保存后的图片变模糊了怎么办?Word 2019 默认保存后压缩变模糊的问题,解决方案

Word 2019 默认保存后压缩变模糊的问题&#xff0c;解决方案 1&#xff0c;新建word 文件&#xff0c;插入一张原始图片&#xff0c;1080*1920&#xff0c;如下图&#xff1a; 2&#xff0c;保存时&#xff0c;word 2019默认选项&#xff0c;导致word 保存后&#xff0c;图片…

CTFshow web入门web127-php特性30

开启环境: extract() 函数从数组中将变量导入到当前的符号表&#xff0c;使用数组键名作为变量名&#xff0c;使用数组键值作为变量值 举例就是?a2&#xff0c;就会变成$a2&#xff0c;这里ctf_show有个_需要构造&#xff0c;前面说过php中变量名只有数字字母下划线&#xff…

<HarmonyOS主题课>1~3课后习题汇总

&#xff1c;HarmonyOS第一课&#xff1e;1~10课后习题汇总 1使用DevEco Studio高效开发 单选题 用哪一种装饰器修饰的组件可作为页面入口组件&#xff1f;&#xff08;B&#xff09; A. ComponentB. EntryC. PreviewD. Builder ArkTS Stage模型支持API Version 9&#xf…

uniapp 日历组件

我们的需求是显示当前月和下个月的排班表 引入 uniapp 日历组件 uni-calendar 做法有两种&#xff0c;一种是直接去修改组件&#xff0c;还有就是文档中提供的 selected 方法 修改组件的就不写了 <uni-calendar :lunar"true" :selected"selected" :in…

【demoSURF】室内定位(图像匹配)基础代码实现,包含所有可以出现问题的解法

代码如下 import numpy as np import cv2 from matplotlib import pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号img1 cv2.imread("D:/data/North/0007.JPG",0) i…

【C语言】自己代码实现字符串相关的常用API

目录 1、实现get(char *)&#xff1b;从键盘获取字符串2、实现put&#xff08;char *&#xff09;&#xff1b;输出字符串3、实现strlen&#xff08;char *&#xff09;&#xff1b;求字符串长度4、实现strcpy&#xff08;char *&#xff0c;char *&#xff09;&#xff1b;拷贝…

C#,入门教程(11)——枚举(Enum)的基础知识和高级应用

上一篇&#xff1a; C#&#xff0c;入门教程(10)——常量、变量与命名规则的基础知识https://blog.csdn.net/beijinghorn/article/details/123913570 不会枚举&#xff0c;就不会编程&#xff01; 枚举 一个有组织的常量系列 比如&#xff1a;一个星期每一天的名字&#xf…

使用HttpSession和过滤器实现一个简单的用户登录认证的功能

这篇文章分享一下怎么通过session结合过滤器来实现控制登录访问的功能&#xff0c;涉及的代码非常简单&#xff0c;通过session保存用户登录的信息&#xff0c;如果没有用户登录的话&#xff0c;会在过滤器中处理&#xff0c;重定向回登录页面。 创建一个springboot项目&#…

Visual Studio 2017 + opencv4.6 + contribute + Cmake(Aruco配置版本)指南

之前配置过一次这个&#xff0c;想起这玩意就难受&#xff0c;贼难配置。由于要用到里面的一个库&#xff0c;不得已再进行配置。看网上的博客是真的难受&#xff0c;这写一块&#xff0c;那里写一块&#xff0c;乱七八糟&#xff0c;配置一顿发现写的都是错的&#xff0c;还得…

Materail Design 进阶(十一)——MaterialButton使用

距离上次写Material组件的文章已经过去了好多年&#x1f604;&#xff0c;最近在写Flutter又接触到了Material&#xff0c;已经升级了许多&#xff0c;这次就用新的组件来试试吧&#xff5e; Button组件大家都非常熟悉了&#xff0c;如果画一个带圆角&#xff0c;边框的按钮&a…

FFmpeg读取Assets资源文件

在Android开发中我们经常把原生资源文件放在assets目录下以供需要时读取&#xff0c;通过API提供的resources.assets.open(filename)/openFd(filenam)方法可以非常方便获得InputStream或FileDescriptor&#xff08;文件标识符&#xff09;&#xff0c;但是在使用FFmpeg读取Asse…

JavaScript系列——同步与异步

文章目录 概要同步代码&#xff1a;异步代码 JavaScript运行机制运行时概念栈&#xff08;stack&#xff09;堆队列消息的添加 异步场景网络请求 异步编程优化小结 概要 异步&#xff0c;按照字面理解&#xff0c;指的是两个或者两个以上的对象或事件不同时存在或者发生&#…

透明OLED屏的稳定性:从技术角度及应用案例解析

在显示技术日新月异的今天&#xff0c;透明OLED屏以其独特的透明特性和出色的显示效果&#xff0c;吸引了众多关注。然而&#xff0c;对于这种新型技术的稳定性&#xff0c;人们难免会有所疑虑。作为一名专注于OLED技术研发的工程师&#xff0c;尼伽小编将从专业角度出发&#…

十种编程语言的对比分析

在当今的软件开发领域&#xff0c;编程语言扮演着至关重要的角色。不同的编程语言各有其特点和适用场景&#xff0c;选择合适的编程语言能够提高开发效率和软件质量。本文将对十种常见的编程语言进行对比分析&#xff0c;帮助读者了解它们的优缺点和适用场景。 一、Python Pyt…

云化XR技术于农业领域中的表现

随着科技的不断发展和应用的深入&#xff0c;农业领域也在逐渐引入新技术来优化生产效率和成本、改进管理和监控等。云化XR&#xff08;CloudXR&#xff09;作为一种融合了云计算、虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;等技术的解决方案&am…

生信技能33 - gnomAD数据库hg19/hg38 VCF文件批量下载脚本

gnomAD数据库下载地址 gnomAD downloads gnomAD v2.1.1数据集包含来自125,748个外显子组和15,708个全基因组的数据,所有这些数据都映射到GRCh 37/hg 19和GRCh 38/hg 38 两个版本的参考序列。 gnomAD数据库hg19与hg39 VCF文件批量下载脚本 download.sh # 获取当前目录路径…

C++-异常处理

1、概念 异常时程序在执行期间产生的问题。C异常是指在程序运行时发生的特殊情况。比如string::at函数下标越界等。 异常提供了一种转移程序控制权的方式。 一旦程序出现异常没有经过处理&#xff0c;就会造成程序运行崩溃。 处理异常的方式有&#xff1a;抛出异常&#xff08;…