Python算法题集_二叉树的直径

 Python算法题集_二叉树的直径

  • 题543:二叉树的直径
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【DFS+字典引用】
    • 2) 改进版一【DFS+全局变量】
    • 3) 改进版二【DFS+递归返回】
  • 4. 最优算法

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

题543:二叉树的直径

1. 示例说明

  • 给你一棵二叉树的根节点,返回该树的 直径

    二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root

    两节点之间路径的 长度 由它们之间边数表示。

    示例 1:

    img

  输入:root = [1,2,3,4,5]
输出:3解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:

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

提示:

  • 树中节点数目在范围 [1, 104]
  • -100 <= Node.val <= 100

2. 题目解析

- 题意分解

  1. 本题为检查二叉树中任意两个节点的最长距离
  2. 基本的设计思路是深度优先算法【DFS(Depth-First Search)】

- 优化思路

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

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

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

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

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

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

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


- 测量工具

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

3. 代码展开

1) 标准求解【DFS+字典引用】

使用可变量字典传递最长路径长度

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

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

2) 改进版一【DFS+全局变量】

使用全局变量列表传递最长路径长度

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

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

3) 改进版二【DFS+递归返回】

使用递归函数返回值传递最长路径长度

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

import CheckFuncPerf as cfpclass Solution:def diameterOfBinaryTre_ext2(self, root):def getdepth(root):if root is None:return 0, 0left_depth, left_max = getdepth(root.left)right_depth, right_max = getdepth(root.right)depth = 1 + max(left_depth, right_depth)imaxlen = max(left_max, right_max, left_depth + right_depth)return depth, imaxlendepth, imaxlen = getdepth(root)return imaxlenaroot = 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. 最优算法

根据本地日志分析,最优算法为第3种方式【DFS+递归返回】isSymmetric_base

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.diameterOfBinaryTre_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))
result = cfp.getTimeMemoryStr(Solution.diameterOfBinaryTre_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))
result = cfp.getTimeMemoryStr(Solution.diameterOfBinaryTre_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 算法本地速度实测比较
函数 diameterOfBinaryTre_base 的运行时间为 924.05 ms;内存使用量为 4.00 KB 执行结果 = 102
函数 diameterOfBinaryTre_ext1 的运行时间为 583.67 ms;内存使用量为 0.00 KB 执行结果 = 102
函数 diameterOfBinaryTre_ext2 的运行时间为 425.10 ms;内存使用量为 0.00 KB 执行结果 = 102

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

may the odds be ever in your favor ~

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

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

相关文章

Linux内核-时间子系统(时钟中断)专题汇总

文章目录 概要一、专题汇总1.1、优秀系列博文1.2、时间子系统1.3、高精度定时器hrtimer1.4、RTC硬件芯片驱动 概要 中断机制是计算机系统的重要组成部分&#xff0c;在Linux中也不例外&#xff0c;中断按照来源分为硬中断和软中断&#xff0c;而硬中断根据硬件范围分为外中断和…

GPT翻译网站的加载与使用

Sider: ChatGPT侧边栏 GPTs, GPT-4 Turbo, 联网, 绘图 sider.ai https://chromewebstore.google.com/detail/sider-chatgpt%E4%BE%A7%E8%BE%B9%E6%A0%8F-gpts-g/difoiogjjojoaoomphldepapgpbgkhkb?hlzh-CN 加入与移除 第二个翻译网站 https://chromewebstore.google.com/…

MATLAB知识点:poissrnd函数(★★☆☆☆)生成泊松分布的随机数

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第三…

Sibelius安装包免费下载激活指南,西贝柳斯,专业作曲打谱软件

Sibelius来自芬兰音乐巨匠西贝柳斯的故乡&#xff0c;被誉为世界上最强的五线谱软件。Sibelius功能全面、音色音质精准受到广大作曲家的喜爱。其乐谱记号十分全面&#xff0c;所有的乐谱都可以应付自如&#xff0c;Sibelius可以迅速完成作曲、编曲、发布任务&#xff0c;轻松开…

react+ts【项目实战一】配置项目/路由/redux

文章目录 1、项目搭建1、创建项目1.2 配置项目1.2.1 更换icon1.2.2 更换项目名称1.2.1 配置项目别名 1.3 代码规范1.3.1 集成editorconfig配置1.3.2 使用prettier工具 1.4 项目结构1.5 对css进行重置1.6 注入router1.7 定义TS组件的规范1.8 创建代码片段1.9 二级路由和懒加载1.…

微服务中台架构的设计与实现

本文将探讨微服务中台架构的设计与实现&#xff0c;介绍如何通过微服务的方式进行系统拆分和组合&#xff0c;构建灵活、可扩展且易于维护的中台架构&#xff0c;以加速企业的数字化转型和提升竞争力。 ## 1. 引言 随着企业规模的不断扩大和业务的日益复杂化&#xff0c;传统…

飞天使-k8s知识点18-kubernetes实操3-pod的生命周期

文章目录 探针的生命周期流程图prestop 探针的生命周期 docker 创建&#xff1a;在创建阶段&#xff0c;你需要选择一个镜像来运行你的应用。这个镜像可以是公开的&#xff0c;如 Docker Hub 上的镜像&#xff0c;也可以是你自己创建的自定义镜像。创建自己的镜像通常需要编写一…

Tuxera NTFS2024版本的文件操作功能有哪些特点?

Tuxera NTFS通过集成先进的文件系统驱动程序和算法&#xff0c;实现了对多种文件系统的全面支持。具体来说&#xff0c;它具备以下功能和特点&#xff0c;使其能够支持多种文件系统&#xff1a; Tuxera NTFS2024下载如下: https://wm.makeding.com/iclk/?zoneid58824 先进的…

wechat协议接口免费分享(价值5w)

几乎涵盖所有功能&#xff0c;仅供学习交流使用&#xff01; 接口地址 https://apifox.com/apidoc/shared-86280587-c0f0-480a-85de-ee292b4aae82/doc-3721193

RK3568平台开发系列讲解(实验篇)杂项设备驱动实验

🚀返回专栏总目录 文章目录 一、什么是杂项设备驱动二、杂项设备的注册和卸载三、杂项设备驱动实验代码沉淀、分享、成长,让自己和他人都能有所收获!😄 一、什么是杂项设备驱动 在 Linux 中,把无法归类的五花八门的设备定义成杂项设备。相较于字符设备,杂项设备有以下两…

Activation of network connection failed(ubuntu连不上网)

ubuntu连不上网&#xff0c;看了好几个方法找到个有用的记录一下 1. 还原默认设置 2. 更改适配器&#xff1a;加上vmware bridge protocol

(13)Hive调优——动态分区导致的小文件问题

前言 动态分区指的是&#xff1a;分区的字段值是基于查询结果自动推断出来的&#xff0c;核心语法就是insertselect。 具体内容指路文章&#xff1a; https://blog.csdn.net/SHWAITME/article/details/136111924?spm1001.2014.3001.5501文章浏览阅读483次&#xff0c;点赞15次…