Python算法题集_二叉树的最大深度

 Python算法题集_二叉树的最大深度

  • 题104:二叉树的最大深度
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【DFS+自顶向下】
    • 2) 改进版一【DFS+自底向上】
    • 3) 改进版二【BFS】
  • 4. 最优算法

本文为Python算法题集之一的代码示例

题104:二叉树的最大深度

1. 示例说明

  • 给定一个二叉树 root ,返回其最大深度。

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

    示例 1:

    img

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

    示例 2:

    输入:root = [1,null,2]
    输出:2
    

    提示:

    • 树中节点的数量在 [0, 104] 区间内。
    • -100 <= Node.val <= 100

2. 题目解析

- 题意分解

  1. 本题为求二叉树的最大深度
  2. 基本的解法是深度优先算法【DFS】、广度有限算法【BFS】

- 优化思路

  1. 通常优化:减少循环层次

  2. 通常优化:增加分支,减少计算集

  3. 通常优化:采用内置算法来提升计算速度

  4. 分析题目特点,分析最优解

    1. 可以用递归法实现深度优先【Depth-First Search】算法

    2. 可以用双向队列deque来实现广度优先【Breadth-First Search】算法


- 测量工具

  • 本地化测试说明:LeetCode网站测试运行时数据波动很大,因此需要本地化测试解决这个问题
  • CheckFuncPerf(本地化函数用时和内存占用测试模块)已上传到CSDN,地址:Python算法题集_检测函数用时和内存占用的模块
  • 本题本地化超时测试用例自己生成,详见【最优算法章节】

3. 代码展开

1) 标准求解【DFS+自顶向下】

自顶向下的深度优先算法

马马虎虎,超过59%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def maxDepth_base(self, root):def topdown(node, ilevel):if not node:return ilevelreturn  max(topdown(node.left, ilevel + 1), topdown(node.right, ilevel + 1))return topdown(root, 0)aroot = generate_binary_tree(ilen, imode)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.maxDepth_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 maxDepth_base 的运行时间为 424.10 ms;内存使用量为 4.00 KB 执行结果 = 52

2) 改进版一【DFS+自底向上】

自底向上的深度优先算法

马马虎虎,超过73%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def maxDepth_ext1(self, root):def bottomup(node):if not node:return 0return max(bottomup(node.left), bottomup(node.right)) + 1return bottomup(root)aroot = generate_binary_tree(ilen, imode)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.maxDepth_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 maxDepth_ext1 的运行时间为 390.09 ms;内存使用量为 0.00 KB 执行结果 = 52

3) 改进版二【BFS】

使用双端队列deque 来实现广度优先算法

性能优良,超过89%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def maxDepth_ext2(self, root):from collections import dequeif root is None:return 0deque_tree = deque([root])ilevel = 0while deque_tree:ilen = len(deque_tree)for iIdx in range(ilen):tmpNode = deque_tree.popleft()if tmpNode.left is not None:deque_tree.append(tmpNode.left)if tmpNode.right is not None:deque_tree.append(tmpNode.right)ilevel += 1return ilevelaroot = generate_binary_tree(ilen, imode)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.maxDepth_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 maxDepth_ext2 的运行时间为 390.09 ms;内存使用量为 0.00 KB 执行结果 = 52

4. 最优算法

根据本地日志分析,最优算法为第3种【BFS】maxDepth_ext2

import random
ilen, imode = 1000000, 1
def generate_binary_tree(node_count, imode):if node_count <= 0:return Noneroot = TreeNode(random.randint(1, 100))node_count -= 1if imode > 3:imode = 1if imode == 1:left = generate_binary_tree(node_count // 2, imode+1)right = generate_binary_tree(node_count // 2, imode+1)root.left = leftroot.right = rightelif imode==2:left = generate_binary_tree(node_count, imode+1)root.left = leftelse:right = generate_binary_tree(node_count, imode+1)root.right = rightreturn root
aroot = generate_binary_tree(ilen, imode)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.maxDepth_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))
result = cfp.getTimeMemoryStr(Solution.maxDepth_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))
result = cfp.getTimeMemoryStr(Solution.maxDepth_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 算法本地速度实测比较
函数 maxDepth_base 的运行时间为 424.10 ms;内存使用量为 4.00 KB 执行结果 = 52
函数 maxDepth_ext1 的运行时间为 390.09 ms;内存使用量为 0.00 KB 执行结果 = 52
函数 maxDepth_ext2 的运行时间为 386.09 ms;内存使用量为 992.00 KB 执行结果 = 52

一日练,一日功,一日不练十日空

may the odds be ever in your favor ~

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

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

相关文章

144.【Activiti 7】

Activiti 7 工作流 (一)、工作流程1.概念2.工作流系统3.适用行业4.具体应用5.实现方式 (二)、Activiti7概述1.介绍(1).BPM 介绍(2).BPM软件(3). BPMN 2.使用步骤(1).部署activiti(2).流程定义(3).流程定义部署(4).启动一个流程实例(5).用户查询待办任务(Task)(6).用户办理任务(…

EsayExcel文件导入导出

目录 准备工作 监听器类 导入测试 导出测试 上传Excel 下载Excel 混合导出模板导出 headRowNumber(1)&#xff1a;从第几行开始读 准备工作 导入依赖 <!--easyexcel--> <dependency><groupId>com.alibaba</groupId>x<artifactId>easye…

Unicode编码的魅力:跨语言交流的桥梁

title: Unicode编码的魅力&#xff1a;跨语言交流的桥梁 date: 2024/2/15 14:04:00 updated: 2024/2/15 14:04:00 tags: Unicode编码跨语言多语言支持存储开销兼容性文本处理全球化软件 引言&#xff1a; Unicode编码是一种用于表示世界上所有字符的标准编码方式。它解决了字…

探索IDE的世界:什么是IDE?以及适合新手的IDE推荐

引言 在编程的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;是我们日常工作的重要工具。无论是初学者还是经验丰富的开发者&#xff0c;一个好的IDE都能极大地提高我们的编程效率。那么&#xff0c;什么是IDE呢&#xff1f;对于新手来说&#xff0c;又应该选择哪…

常见单例模式详解

单例模式是23种设计模式中应用最广的模式之一&#xff0c;其定义&#xff1a;确保某一个类只有一个实例&#xff0c;而且自行实实例化并向整个系统通过这个实例。其类图如下&#xff1a; 通俗来说&#xff0c;单例模式就是用于创建那些在软件系统中独一无二的对象。在一个软件系…

Java 基于 SpringBoot+Vue 的智慧外贸平台的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

基于Transformer的机器学习模型的主动学习

主动学习和基于Transformer的机器学习模型的结合为有效地训练深度学习模型提供了强有力的工具。通过利用主动学习&#xff0c;数据科学家能够减少训练模型所需的标记数据的数量&#xff0c;同时仍然达到高精度。本文将探讨基于Transformer的机器学习模型如何在主动学习环境中使…

嵌入式Linux中系统调试常用命令

在 Linux 中&#xff0c;获取系统信息和监控系统资源的操作是非常常见的任务。以下是一些常用的命令和工具&#xff0c;以及一些相关的系统文件&#xff0c;用于获取 Linux 系统信息和监控系统资源。 1. 基本系统信息 uname 命令 uname 命令用于显示系统信息。 查看内核版本&…

【Python】高级数据类型

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

洛谷C++简单题小练习day11—字母转换,分可乐两个小程序

day11--字母转换--2.14 习题概述 题目描述 输入一个小写字母&#xff0c;输出其对应的大写字母。例如输入 q[回车] 时&#xff0c;会输出 Q。 代码部分 #include<bits/stdc.h> using namespace std; int main() { char n;cin>>n;cout<<char(n-32)<…

C++:Level1阶段测试

总结。 只要你看过我的文章&#xff0c;哪怕只是一半&#xff0c;一定能够过关&#xff01; 准备好开始测试氻吗&#xff1f; 选择题&#xff0c;每题4分&#xff0c;共40分 1、 DevC的项目创建按钮是_____ A、文件[F]” → “新建[N]” → “项目[P]... B、工具[T]” → …

TMGM外汇平台,澳网的官方赞助商

TMGM澳洲总部公司很高兴地通知大家&#xff0c;为了带给客户们更优质的交易环境体验&#xff0c;我们预计将于2024年2月上线MT5交易平台TMGM作为2021-2023 澳网的官方赞助商&#xff0c;能见证郑钦文取得如此的成就由衷的为她感到骄傲&#xff01;本届澳网&#xff0c;TMGM邀请…