Python算法题集_二叉树的层序遍历

 Python算法题集_二叉树的层序遍历

  • 题102:二叉树的层序遍历
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【DFS递归】
    • 2) 改进版一【BFS迭代】
    • 3) 改进版二【BFS迭代+循环】
  • 4. 最优算法

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

题102:二叉树的层序遍历

1. 示例说明

  • 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

    示例 1:

    img

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

    示例 2:

    输入:root = [1]
    输出:[[1]]
    

    示例 3:

    输入:root = []
    输出:[]
    

    提示:

    • 树中节点数目在范围 [0, 2000]
    • -1000 <= Node.val <= 1000

2. 题目解析

- 题意分解

  1. 本题为对二叉树进行层序遍历,每层从左到右列出节点值
  2. 基本的设计思路是深度优先算法【DFS(Depth-First Search)】、广度有限算法【BFS(Breadth-First Search)】

- 优化思路

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

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

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

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

    1. 本地需要采用DFS进行路径长度计算

    2. 可以考虑在递归函数中使用可变量【通过引用传递】

    3. 可以考虑在递归函数中返回最大值【通过值传递】


- 测量工具

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

3. 代码展开

1) 标准求解【DFS递归】

使用深度优先算法,在递归中传入层级参数,将节点值从左到右保存到结果中

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

import CheckFuncPerf as cfpclass Solution:def levelOrder_base(self, root):if not root:return []result = []def dfsTraversal(ilevel, root):if len(result) < ilevel:result.append([])result[ilevel - 1].append(root.val)if root.left:dfsTraversal(ilevel + 1, root.left)if root.right:dfsTraversal(ilevel + 1, root.right)dfsTraversal(1, root)return resultaroot = generate_symmetry_binary_tree(ilen)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.levelOrder_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][4]))# 运行结果
函数 levelOrder_base 的运行时间为 174.03 ms;内存使用量为 2720.00 KB 执行结果 = [14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14]

2) 改进版一【BFS迭代】

使用列表结构【list】作为队列,先进先出实现BFS遍历,填充每层节点

独孤求败,超越99%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def levelOrder_ext1(self, root):if not root:return []result = []stack_tree = [(root, 1)]while stack_tree:node, depth = stack_tree.pop(-1)if len(result) < depth:result.append([])result[depth - 1].append(node.val)if node.right: stack_tree.append((node.right, depth + 1))if node.left: stack_tree.append((node.left, depth + 1))return resultaroot = generate_symmetry_binary_tree(ilen)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.levelOrder_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][4]))# 运行结果
函数 levelOrder_ext1 的运行时间为 183.02 ms;内存使用量为 2156.00 KB 执行结果 = [14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14]

3) 改进版二【BFS迭代+循环】

使用列表结构【list】作为堆栈,后进先出实现BFS遍历,填充每层节点,效率不如队列结果

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

import CheckFuncPerf as cfpclass Solution:def levelOrder_ext2(self, root):if not root:return []result = []queue_tree = [root]while queue_tree:ilen = len(queue_tree)tmp = []for iIdx in range(ilen):tmproot = queue_tree.pop(0)tmp.append(tmproot.val)if tmproot.left:queue_tree.append(tmproot.left)if tmproot.right:queue_tree.append(tmproot.right)result.append(tmp)return resultaroot = generate_binary_tree(ilen, imode)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.diameterOfBinaryTre_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 diameterOfBinaryTre_ext2 的运行时间为 425.10 ms;内存使用量为 0.00 KB 执行结果 = 102

4. 最优算法

根据本地日志分析,最优算法为第1种方式【DFS递归】levelOrder_base

ilen = 18
def generate_symmetry_binary_tree(ilevel):if ilevel <= 0:return Noneroot = TreeNode(ilevel)left = generate_symmetry_binary_tree(ilevel - 1)right = generate_symmetry_binary_tree(ilevel - 1)root.left = leftroot.right = rightreturn root
aroot = generate_symmetry_binary_tree(ilen)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.levelOrder_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][4]))
result = cfp.getTimeMemoryStr(Solution.levelOrder_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][4]))
result = cfp.getTimeMemoryStr(Solution.levelOrder_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][4]))# 算法本地速度实测比较
函数 levelOrder_base 的运行时间为 174.03 ms;内存使用量为 2720.00 KB 执行结果 = [14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14]
函数 levelOrder_ext1 的运行时间为 183.02 ms;内存使用量为 2156.00 KB 执行结果 = [14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14]
函数 levelOrder_ext2 的运行时间为 7326.64 ms;内存使用量为 3916.00 KB 执行结果 = [14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14]

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

may the odds be ever in your favor ~

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

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

相关文章

我的NPI项目之嵌入式总线系列(一) -- SPI 总线

SPI总线很有意思&#xff0c; 如我的NPI项目之Android 安全系列 -- 外挂SE集成&#xff08;SPI&#xff09;接口-CSDN博客 提到SPI的接口&#xff0c;基本的电气特性已经给出。这边文章就针对协议部分进行详细解析。从协议网找到了原文&#xff1a;SPI protocol 还有wilipedi…

(五)【Jmeter】使用代理录制HTTP脚本操作步骤及注意事项

前置信息 软件版本Jmeter5.6.3服务网址备注drupalhttp://192.168.88.88:18080/(二)【Jmeter】专栏实战项目靶场drupal部署 用户名密码test1test1test2test2实操记录 1、启动jmeter,操作顺序见下图 2、在视图面板添加如下信息,点击开始

请标记你的龙年心愿关键词

昨天外孙陪我游了崇州市白头镇、道民镇&#xff08;竹艺村&#xff09;&#xff0c;见我心情愉悦&#xff0c;今天再陪我去饱览其他风景名胜&#xff0c;所以笔者——本“人民体验官”特别推广人民日报官方微博文化产品《2024年第一批春花开了》《#大年初七#&#xff0c;标记你…

【Linux取经路】文件系统之被打开的文件——文件描述符的引入

文章目录 一、明确基本共识二、C语言文件接口回顾2.1 文件的打开操作2.2 文件的读取写入操作2.3 三个标准输入输出流 三、文件有关的系统调用3.1 open3.1.1 比特位级别的标志位传递方式 3.2 write3.2.1 模拟实现 w 选项3.2.2 模拟实现 a 选项 3.3 read 四、访问文件的本质4.1 再…

ArduPilot开源飞控之硬件SBC分析

ArduPilot开源飞控之硬件SBC分析 1. 源由2. Companion Computer2.1 APSync【不推荐&#xff0c;无更新】2.2 DroneKit【不推荐&#xff0c;无更新/SDK】2.3 FlytOS【不推荐&#xff0c;闭源】2.4 Maverick【不推荐&#xff0c;闭源】2.5 ROS【专门讨论&#xff0c;开源/复杂】2…

保育员线上考试答案查找?分享8个有手机就能搜题的工具 #经验分享#其他

市面上搜题软件不少&#xff0c;大部分都挺好用的&#xff0c;今天小编在这里给大家分享几个好用的搜题工具&#xff0c;都拥有丰富的题库资源&#xff1b;而且搜题功能也都很完善&#xff0c;手机端、网页端均有&#xff0c;有需要的小伙伴赶紧码住&#xff01; 1.题老大 这…

Rust 数据结构与算法:4栈:用栈实现进制转换

2、进展转换 将十进制数转换为二进制表示形式的最简单方法是“除二法”&#xff0c;可用栈来跟踪二进制结果。 除二法 下面实现一个将十进制数转换为二进制或十六进制的算法&#xff0c;代码如下&#xff1a; #[derive(Debug)] struct Stack<T> {size: usize, // 栈大…

MySQL安装问题:由于找不到MSVCP120.dll,无法继续执行代码.重新安装程序可能会解决此问题。

出现的问题&#xff1a; 解决&#xff1a;由于没有安装微软常用运行库合集64位导致的问题 下载vcredist_x64 https://www.microsoft.com/zh-CN/download/details.aspx?id40784 下载完成后&#xff0c;点击运行解决问题。

【知识图谱--第四讲知识图谱的抽取与构建】

知识图谱的抽取与构建 实体识别与分类关系抽取与属性补全概念抽取事件识别与抽取 实体识别与分类 关系抽取与属性补全 概念抽取 事件识别与抽取

【开源】SpringBoot框架开发农家乐订餐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核心代码4.1 查询菜品类型4.2 查询菜品4.3 加购菜品4.4 新增菜品收藏4.5 新增菜品留言 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的农家乐订餐系统&#xff0c…

【Windows】删除 VHD 虚拟磁盘时提示“文件已在 System 中打开”的解决方法

一、原因 正如显示的那样&#xff0c;虚拟磁盘仍在被系统占用。因此我们需要断开磁盘与系统的连接。 二、解决方法 1. 在“开始”菜单中搜索“磁盘管理”&#xff0c;选择“创建并格式化硬盘分区”。 2. 右键点击需要删除的虚拟磁盘&#xff0c;选择“分离 VHD”。 3. 点击“…

一款基于MSSQL数据库注入的利用工具-SqlmapXPlus

一、基本介绍 在众多的地区性攻防演练中&#xff0c;SQL Server数据库堆叠注入仍有较高的爆洞频率&#xff0c;但因为一些常见的演练场景限制&#xff0c;如不出网、低权限、站库分离、终端防护、上线困难、权限维持繁琐等&#xff0c;仅一个–os-shell已经难满足我们的需求。…