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

news2024/11/27 17:47:16

 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 cfp

class 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 result

aroot = 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 cfp

class 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 result

aroot = 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 cfp

class 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 result

aroot = 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 None
    root = TreeNode(ilevel)
    left = generate_symmetry_binary_tree(ilevel - 1)
    right = generate_symmetry_binary_tree(ilevel - 1)
    root.left = left
    root.right = right
    return 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.coloradmin.cn/o/1450757.html

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

相关文章

变分自编码器(VAE)PyTorch Lightning 实现

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Tcl 过程

一个Tcl过程就是Tcl脚本定义的一个命令。可以使用proc命令定义新的过程。Tcl还提供了处理变量作用域的特殊命令&#xff0c;这些命令允许使用引用而非值传递参数&#xff0c;并能把新的Tcl控制结构实现为过程。 一、proc与return 过程由proc命令创建, 其中参数{a b} 中的大括…

【Win10 触摸板】在插入鼠标时禁用触摸板,并在没有鼠标时自动启用触摸板。取消勾选连接鼠标时让触摸板保持打开状态,但拔掉鼠标后触摸板依旧不能使用

出现这种问题我的第一反应就是触摸板坏了&#xff0c;但是无意间我换了一个账户发现触摸板可以用&#xff0c;因此推断触摸板没有坏&#xff0c;是之前的账户问题&#xff0c;跟系统也没有关系&#xff0c;不需要重装系统。 解决办法&#xff1a;与鼠标虚拟设备有关 然后又从知…

【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 有了优秀的模型&#xff0c;就有了优化超参数以获得最佳得分模型的难题。那么&#xff0c;什么是超参数优化呢&#xff1f;假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…

Vulnhub靶机:DC5

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;DC5&#xff08;10.0.2.58&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/dc/DC-5.zi…

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

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

SG7050EEN晶体振荡器SPXO规格书

频率范围:25mhz ~ 500mhz供电电压:2.5 V型。/ 3.3 V类型功能:输出使能(OE)外形尺寸:7.0 5.0 1.5 mm输出:LV-PECL低相位抖动:50fs型。(f0 156.25 MHz)工作温度:-40℃~ 105℃ 规范

二叉树相关OJ题

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 一、选择题 1、某二叉树共有 399 个结点&#xff0c;其中有 199 个度为 2 的结点&#xff0c;则该二叉树中的叶子结点数为&#xff08; &#xff09; A.不存在这样的二叉树 B.200 C.198 D.199解析&#xff1a;选B&…

致创新者:聚焦目标,而非问题

传统的企业创新管理方式常常导致组织内部策略不协调、流程低效、创新失败率高等问题。而创新运营作为企业管理创新的新模式&#xff0c;通过整合文化、实践、人员和工具&#xff0c;提高组织创新能力。已经采用创新运营的公司报告了一系列积极的结果&#xff0c;如市场推出速度…

最长连续手牌 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 有这么一款单人卡牌游戏&#xff0c;牌面由颜色和数字组成&#xff0c;颜色为红、黄、蓝、绿中的一种&#xff0c;数字为 0−9 中的一个。游戏开始时玩家从手牌中…

力扣hot3--并查集+哈希

第一想法是排个序然后遍历一遍&#xff0c;but时间复杂度就超啦 并查集居然与哈希结合了&#xff08;&#xff09; 已经好久没用过并查集了&#xff0c;&#xff0c;&#xff0c;我们用哈希表f_node中来记录原结点的父节点&#xff0c;其中key是原结点&#xff0c;value是父节点…

OpenHarmony—UIAbility组件生命周期

概述 当用户打开、切换和返回到对应应用时&#xff0c;应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调&#xff0c;通过这些回调可以知道当前UIAbility实例的某个状态发生改变&#xff0c;会经过UIAbility实例的创建和销毁&#xff0c;…

代码随想录算法训练营第二十七天|贪心算法理论基础,455.分发饼干,376. 摆动序列,53. 最大子序和

系列文章目录 代码随想录算法训练营第一天|数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

抖音私信自动回复工具使用教程!

该工具基于网页版抖音&#xff0c;可以用于抖音个人号等任何权限的账号&#xff01; 获取软件 联系我的v 信&#xff1a;llike620 基本使用 了解GPT的&#xff0c;可以配置FastGPT这种训练知识库的AI进行回复 不了解的&#xff0c;可以配置关键词回复 点击抖音私信按钮&a…

Linux设置jar包开机自启动

步骤 1、新建jar包自启文件 sudo vi /etc/init.d/jarSysInit.sh 按i键进入编辑模式输入以下内容&#xff1a; export JAVA_HOME/home/jdk/jdk-11.0.22 export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar export PATH$PATH:$JAVA_…

H5大气的互联网建站服务公司静态HTML网站模板源码

H5大气的互联网建站服务公司静态HTML网站模板源码 源码介绍&#xff1a;一款大气的互联网建站服务公司/工作室静态HTML网站模板&#xff0c;带有多个单页&#xff0c;可自行二开作为工作室或公司官网。 下载地址&#xff1a; https://www.changyouzuhao.cn/13456.html

人力资源智能化管理项目(day08:云存储)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 存储桶列表 &#xff1a;登录 - 腾讯云 API密钥管理&#xff1a;登录 - 腾讯云 上传图片-创建腾讯云存储桶 存储桶名称&#xff1a;intelligentmanagement-1306913843 地…

【Qt】环境安装与初识

目录 一、Qt背景介绍 二、搭建Qt开发环境 三、新建工程 四、Qt中的命名规范 五、Qt Creator中的快捷键 六、QWidget基础项目文件详解 6.1 .pro文件解析 6.2 widget.h文件解析 6.3 widget.cpp文件解析 6.4 widget.ui文件解析 6.5 main.cpp文件解析 七、对象树 八、…

Rust中不可变变量与const有何区别?

Rust作者认为变量默认应该是immutable&#xff0c;即声明后不能被改变的变量。这一点是让跨语言学习者觉得很别扭&#xff0c;不过这一点小的改变带来了诸多好处&#xff0c;本节我们来学习Rust的变量。 什么是变量&#xff1f; 如果你初次学习编程语言&#xff0c;变量会是一…

AlmaLinux更换鼠标样式为Windows样式

文章目录 前言先看看条件与依赖第一步&#xff1a;测试最终效果第二步&#xff1a;使用CursorXP修改鼠标样式CurosrXP安装CursorXP使用 第三步&#xff1a;Linux端环境搭建与命令执行UbuntuFedora其他系统均失败 第四步&#xff1a;应用主题 前言 只不过是突发奇想&#xff0c…