Python世界:力扣题110,平衡二叉树判别,easy

Python世界:力扣题110,平衡二叉树判别,easy

    • 任务背景
    • 思路分析
    • 代码实现
    • 测试套件
    • 本文小结

任务背景


问题来自力扣题目:110 Balanced Binary Tree,大意如下:

Given a binary tree, determine if it is height-balanced

翻译下,需求是:判断给定二叉数是否高度平衡。

思路分析


想练手下二叉树的遍历,结果在easy级上踩了坑,容我细细道来。注意本题中前置条件已默认是二叉树输入,不用考虑非二叉的输入场景。

于是,我把题意理解为,求该树中最小遍历深度和最大遍历深度,两者之差不应超过1.

# Definition for a binary tree node.
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdepth = 0
depth_min = 2**31
depth_max = -1
class Solution(object):def isBalanced(self, root):""":type root: Optional[TreeNode]:rtype: bool"""flag_res = Trueif root == None:return flag_resdef recursive(node):global depth, depth_max, depth_minif node == None:depth_max = max(depth_max, depth)depth_min = min(depth_min, depth)returnprint(node.val)depth = depth + 1recursive(node.left)recursive(node.right)depth = depth - 1# 重要:每次需重新初始化全局变量,否则深度最值不准global depth, depth_max, depth_mindepth_min = 2**31depth_max = -1recursive(root)if (depth_max - depth_min > 1):print(depth_max, depth_min)flag_res = Falsereturn flag_res

初步用例通过后,提交发现这个用例错误:

# case true 错误理解,失败用例
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.left.left.left = TreeNode(8)
root.right.right = TreeNode(3)
root.right.left = TreeNode(6)

才幡然醒悟,题意理解偏了,二叉树是否平衡,本质问的是:平衡树指每个节点的左右两个子树深度差异最大不超过2。

所以,我们应该求:对每个左右子树求取最大深度,比较左右子树差异。

代码实现


# Definition for a binary tree node.
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution(object):def isBalanced(self, root):""":type root: Optional[TreeNode]:rtype: bool"""# get the max depth of treedef recursive(node):if node == None:return 0depth_left = recursive(node.left)depth_right = recursive(node.right)if depth_left < 0 or depth_right < 0:return -1 # 已有子树不平衡if abs(depth_left - depth_right) > 1:return -1 # 当前不平衡return max(depth_left, depth_right) + 1 # 左右子树深度上提depth = recursive(root)return (depth >= 0) # 非负则平衡,负则不平衡

测试套件


单例测试版主调:

# case true
root = TreeNode(1)# case true
root = None# case true
root = TreeNode(0)
root.left = TreeNode(1)
root.right = TreeNode(2)# case false
root = TreeNode(1)
root.right = TreeNode(2)
root.right.left = TreeNode(3)# case true
root = TreeNode(0)
root.left = TreeNode(1)
root.right = TreeNode(2)
root.right.right = TreeNode(3)# case true 错误理解,失败用例
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.left.left.left = TreeNode(8)
root.right.right = TreeNode(3)
root.right.left = TreeNode(6)sol = Solution()
res = sol.isBalanced(root)
print(res)

测试套版主调:

import unittestdef test_base(self, root, ret):sol = Solution()res = sol.isBalanced(root)self.assertEqual(res, ret)# 编写测试套
class TestSol(unittest.TestCase):def test_special1(self):ret = Trueroot = TreeNode(1)test_base(self, root, ret)def test_special2(self):ret = Trueroot = Nonetest_base(self, root, ret)def test_common1(self):ret = Trueroot = TreeNode(0)root.left = TreeNode(1)root.right = TreeNode(2)test_base(self, root, ret)def test_common2(self):ret = Falseroot = TreeNode(1)root.right = TreeNode(2)root.right.left = TreeNode(3)test_base(self, root, ret)def test_common3(self):ret = Trueroot = TreeNode(0)root.left = TreeNode(1)root.right = TreeNode(2)root.right.right = TreeNode(3)test_base(self, root, ret)def test_common4(self):ret = True # 错误理解,失败用例root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)root.left.left.left = TreeNode(8)root.right.right = TreeNode(3)root.right.left = TreeNode(6)# 测试套版本主调
if __name__ == '__main__':print('start!')unittest.main() # 启动单元测试print('done!')

本文小结


呜乎,通过本文实践,简单的事情切不可大意,再次感受到:做正确的事,比正确的做事更重要!

相关参考:https://leetcode.com/problems/balanced-binary-tree/solutions/2428871/very-easy-100-fully-explained-c-java-python-javascript-python3/

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

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

相关文章

Cyberchef使用功能之-多种压缩/解压缩操作对比

cyberchef的compression操作大类中有大量的压缩和解压缩操作&#xff0c;每种操作的功能和区别是什么&#xff0c;本章将进行讲解&#xff0c;作为我的专栏《Cyberchef 从入门到精通教程》中的一篇&#xff0c;详见这里。 关于文件格式和压缩算法的理论部分在之前的文章《压缩…

Leetcode 回文数

下面是解决这个回文数问题的一个Java解法&#xff1a; 代码解释 特殊情况处理&#xff1a; 如果数字是负数&#xff0c;直接返回false&#xff0c;因为负数不可能是回文数。如果数字以0结尾&#xff0c;但不是0本身&#xff0c;也不可能是回文数&#xff08;例如10不是回文数…

笔记02----重新思考轻量化视觉Transformer中的局部感知CloFormer(即插即用)

1. 基本信息 论文标题: 《Rethinking Local Perception in Lightweight Vision Transformer》中文标题: 《重新思考轻量化视觉Transformer中的局部感知》作者单位: 清华大学发表时间: 2023论文地址: https://arxiv.org/abs/2303.17803代码地址: https://github.com/qhfan/CloF…

JVM垃圾回收详解(重点)

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收 Java 堆是垃圾收集器管理的主要区域&#xff0c;因此也被称作 GC 堆&#xff08;Garbage Collected Heap&…

深入探索Python集合(Set)的高效应用:数据处理、性能优化与实际案例分析

文章目录 前言&#x1fa81;一、 定义集合1.1 使用大括号 {} 定义集合1.2 使用 set() 函数定义集合 &#x1fa81;二、添加元素2.1 使用 add() 方法2.2 使用 update() 方法 &#x1fa81;三、移除元素3.1 使用 remove() 方法3.2 使用 discard() 方法3.3 使用 pop() 方法3.4 使用…

STM32单片机CAN总线汽车线路通断检测-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展&#xff0c;车辆通信接口在汽车电子控…

NIST 发布后量子密码学转型战略草案

美国国家标准与技术研究所 (NIST) 发布了其初步战略草案&#xff0c;即内部报告 (IR) 8547&#xff0c;标题为“向后量子密码标准过渡”。 该草案概述了 NIST 从当前易受量子计算攻击的加密算法迁移到抗量子替代算法的战略。该草案于 2024 年 11 月 12 日发布&#xff0c;开放…

Javaweb梳理17——HTMLCSS简介

Javaweb梳理17——HTML&CSS简介 17 HTML&CSS简介17.1 HTML介绍17.2 快速入门17.3 基础标签17.3 .1 标题标签17.3.2 hr标签17.3.3 字体标签17.3.4 换行17.3.8 案例17.3.9 图片、音频、视频标签17.3.10 超链接标签17.3.11 列表标签17.3.12 表格标签17.3.11 布局标签17.3.…

【支持向量机(SVM)】:算法原理及核函数

文章目录 1 SVM算法原理1.1 目标函数确定1.2 约束条件优化问题转换1.3 对偶问题转换1.4 确定超平面1.5 计算举例1.6 SVM原理小节 2 SVM核函数2.1 核函数的作用2.2 核函数分类2.3 高斯核函数2.3 高斯核函数API2.4 超参数 γ \gamma γ 1 SVM算法原理 1.1 目标函数确定 SVM思想…

mysql bin log分析

centos7 部署collabora office (yum版 与 docker)_collabora office部署-CSDN博客 1.下载polardb的bin log文件 show binary logs; mysqlbinlog -u 用户名 -p -h 地址 --read-from-remote-server --raw mysql-bin.001768 mysqlbinlog --no-defaults --databasexxx --base64-…

初识进程——Linux

目录 概述 进程控制块 指令知识补充 标识符函数 /proc 目录介绍 /proc/&#xff08;pid&#xff09; cwd exe&#xff1a; fork 结束语 概述 进程是程序执行的实体&#xff0c;两者之间有着密切联系。程序是静态的代码与指令集合&#xff0c;每次运行程序都会创建新的进程…

湘潭大学软件工程算法设计与分析考试复习笔记(三)

回顾 湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;一&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;二&#xff09; 前言 现在继续开始复习。每天复习一点点&#xff0c;嘿嘿。今天本来准备写一个动态规划的题的&#xff0c;感觉半懂不懂…

109. UE5 GAS RPG 实现检查点的存档功能

在这一篇文章里&#xff0c;我们接着实现存档的功能&#xff0c;保存当前玩家的生成位置&#xff0c;游戏里有很多中方式去实现玩家的位置存储&#xff0c;这里我们采用检查点的方式&#xff0c;当玩家接触到当前检查点后&#xff0c;我们可以通过检查点进行保存玩家的状态&…

如何创建一个项目用于研究element-plus的原理

需求&#xff1a;直接使用element-plus未封装成组件的源码&#xff0c;创建一个项目&#xff0c;可以使用任意的element-plus组件&#xff0c;可以深度研究组件的运行。例如研究某一个效果&#xff0c;如果直接在node_modules修改elment-plus打包之后的那些js、mjs代码&#xf…

机器学习day7-线性回归3、逻辑回归、聚类、SVC

7欠拟合与过拟合 1.欠拟合 模型在训练数据上表现不佳&#xff0c;在新的数据上也表现不佳&#xff0c;常发生在模型过于简单无法处理数据中的复杂模式时。 特征&#xff1a; 训练误差较高 测试误差也高 模型过于简化&#xff0c;不能充分学习训练数据中的模式 2.过拟合 …

反向代理模块

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

STM32 独立看门狗(IWDG)详解

目录 一、引言 二、独立看门狗的作用 三、独立看门狗的工作原理 1.时钟源 2.计数器 3.喂狗操作 4.超时时间计算 5.复位机制 四、独立看门狗相关寄存器 1.键寄存器&#xff08;IWDG_KR&#xff09; 2.预分频寄存器&#xff08;IWDG_PR&#xff09; 3.重载寄存器&…

足球虚拟越位线技术FIFA OT(二)

足球虚拟越位线技术FIFA OT&#xff08;二&#xff09; 在FIFA认证测试过程中&#xff0c;留给VAR系统绘制越位线的时间只有90秒&#xff08;在比赛中时间可能更短&#xff09;&#xff0c;那么90秒内要做什么事呢&#xff0c;首先场地上球员做出踢球动作&#xff0c;然后VAR要…

MySQL数据库3——函数与约束

一.函数 1.字符串函数 MySQL中内置了很多字符串函数&#xff0c;常用的几个如下&#xff1a; 使用方法&#xff1a; SELECT 函数名(参数);注意&#xff1a;MySQL中的索引值即下标都是从1开始的。 2.数值函数 常见的数值函数如下&#xff1a; 使用方法&#xff1a; SELECT…

Proteus 8.17的详细安装教程

通过百度网盘分享的文件&#xff1a;Proteus8.17(64bit&#xff09;.zip 链接&#xff1a;https://pan.baidu.com/s/1zu8ts1Idhgg9DGUHpAve7Q 提取码&#xff1a;8q8v 1.右击【Proteus8.17(64bit&#xff09;.zip】&#xff0c;选择【全部解压缩......】。 &#xff0c; 2.…