Python算法题集_对称二叉树

 Python算法题集_对称二叉树

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

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

题101:对称二叉树

1. 示例说明

  • 给你一个二叉树的根节点 root , 检查它是否轴对称。

    示例 1:

    img

    输入:root = [1,2,2,3,4,4,3]
    输出:true
    

    示例 2:

    img

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

    提示:

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

    **进阶:**你可以运用递归和迭代两种方法解决这个问题吗?


2. 题目解析

- 题意分解

  1. 本题为检查二叉树是否对称
  2. 基本的设计思路是深度优先算法【DFS(Depth-First Search)】、广度有限算法【BFS(Breadth-First Search)】

- 优化思路

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

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

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

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

    1. 可以考虑使用专门的队列结构deque

- 测量工具

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

3. 代码展开

1) 标准求解【DFS递归】

采用递归计算是否为对称二叉树

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

import CheckFuncPerf as cfpclass Solution:def isSymmetric_base(self, root):def dfscheck(left, right):if left is None and right is None:return Trueif left is None or right is None:return Falseif left.val != right.val:return Falsereturn dfscheck(left.left, right.right) and dfscheck(left.right, right.left)if root is None:return Truereturn dfscheck(root.left, root.right)aroot = generate_symmetry_binary_tree(ilen)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.isSymmetric_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 isSymmetric_base 的运行时间为 45.00 ms;内存使用量为 4.00 KB 执行结果 = True

2) 改进版一【BFS迭代】

使用列表结构【list】作为堆栈,实现BFS搜索进行对称二叉树判断,性能相当低下

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

import CheckFuncPerf as cfpclass Solution:def isSymmetric_ext1(self, root):if root is None:return Trueif root.left is None and root.right is None:return Truequeue_nodes = [(root.left, root.right)]while queue_nodes:left, right = queue_nodes.pop(0) if left is None and right is None:continueif left is None or right is None:return Falseif left.val != right.val:return Falsequeue_nodes.append((left.left, right.right))queue_nodes.append((left.right, right.left))return Truearoot = generate_symmetry_binary_tree(ilen)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.isSymmetric_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 isSymmetric_ext1 的运行时间为 3408.59 ms;内存使用量为 1732.00 KB 执行结果 = True

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

使用高效双端队列结构【deque】作为堆栈,实现BFS搜索进行对称二叉树判断,性能有所改进

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

import CheckFuncPerf as cfpclass Solution:def isSymmetric_ext2(self, root):from collections import dequedeque_tree = deque()deque_tree.append((root, root))while deque_tree:left, right = deque_tree.popleft()if not left and not right:continueif not left or not right:return Falseif left.val != right.val:return Falsedeque_tree.append((left.left, right.right))deque_tree.append((left.right, right.left))return Truearoot = generate_symmetry_binary_tree(ilen)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.isSymmetric_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 运行结果
函数 isSymmetric_ext2 的运行时间为 304.58 ms;内存使用量为 2436.00 KB 执行结果 = True

4. 最优算法

根据本地日志分析,最优算法为第1种方式【DFS递归】isSymmetric_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.isSymmetric_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))
result = cfp.getTimeMemoryStr(Solution.isSymmetric_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))
result = cfp.getTimeMemoryStr(Solution.isSymmetric_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result']))# 算法本地速度实测比较
函数 isSymmetric_base 的运行时间为 45.00 ms;内存使用量为 4.00 KB 执行结果 = True
函数 isSymmetric_ext1 的运行时间为 3408.59 ms;内存使用量为 1732.00 KB 执行结果 = True
函数 isSymmetric_ext2 的运行时间为 304.58 ms;内存使用量为 2436.00 KB 执行结果 = True

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

may the odds be ever in your favor ~

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

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

相关文章

Requests教程-10-Session会话对象

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节中&#xff0c;我们学习了requests的cookies参数使用方法&#xff0c;本小节我们讲解一下requests库中的session会话对象。 在requests中&#xff0c;如果直接利用get()或post()等方法的确可以做到模拟网…

ng : 无法加载文件 C:\Program Files\nodejs\node_global\ng.ps1, 因为在此系统上禁止运行脚本

ng : 无法加载文件 C:\Program Files\nodejs\node_global\ng.ps1&#xff0c;因为在此系统上禁止运行脚本 今天在VSCode中运行ng serve --port 8081运行基于Angular的项目时&#xff0c;报错了&#xff0c;错误如下图所示&#xff1a; 解决方法&#xff1a; 按照下图的5步即…

UnityShader——04渲染流水

渲染流水 GPU应用阶段 把数据加载到显存中设置渲染状态调用DrawCall 将渲染所需数据从硬盘加载到内存中&#xff0c;网格纹理等数据又被加载到显存中&#xff08;一般加载到显存后内存中的数据就会被移除&#xff09; 这些状态定义了场景中的网格是怎样被渲染的。例如&#xf…

springboot191教师工作量管理系统

简介 【 毕设 源码 推荐 javaweb 项目】 基于 springbootvue 的教师工作量管理系统&#xff08;springboot191&#xff09; 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后…

Leetcode 452. 用最少数量的箭引爆气球435. 无重叠区间

class Solution {public int findMinArrowShots(int[][] points) {Arrays.sort(points,(o1,o2)->Integer.compare(o1[0], o2[0]));int count1;//箭的数量for(int i1;i<points.length;i) {if(points[i][0]>points[i-1][1]) {count;//边界没重合&#xff0c;又需要一支箭…

文件操作详解

文章目录 目录1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭 4. 文件的顺序读写5. 通讯录的改造6. 文件的随机读写6.1 fseek6.2 ftell6.3 rewind 7. 文本文件和二进制文件8. 文件读取结束的判定9. 文…

8.JS中的== 操作符的强制类型转换规则

对于 来说&#xff0c;如果对比双方的类型不一样&#xff0c;就会进行类型转换。假如对比 x 和 y 是否相同&#xff0c;就会进行如下判断流程&#xff1a; 首先会判断两者类型是否相同&#xff0c;类型相同的话就比较两者的大小&#xff1b;类型不相同的话&#xff0c;就会进…

java排课管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java排课管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&#…

[python] 罗技动态链接驱动库DLL 控制 键鼠

[python] 罗技动态链接驱动库DLL 控制 键鼠 最近在玩搬砖游戏晶核, 每天有很多重复繁琐的"打卡"操作, 得知隔壁御三家游戏就有大佬做了自动收割的辅助工具,我就想模仿写一个.不过大佬们写的开源工具厉害得多,加了神经网络自动识别,实现寻路和点击功能.我目前最多就是…

AI换脸(视频换脸)讲解-1

AI换脸是一种人工智能技术&#xff0c;它可以将一个人的面部表情和特征应用到另一个人的脸部上&#xff0c;以创建逼真的视频和图像。 首先&#xff0c;AI换脸技术需要大量的训练数据。这些数据通常是由多个人以不同的表情、姿态、光照条件下的照片或视频组成。通过使用人工智…

AI算法初识之分类汇总

一、背景 AI算法的分类方式多种多样&#xff0c;可以根据不同的学习机制、功能用途以及模型结构进行划分。以下是一些主要的分类方式及相应的代表性算法&#xff1a; 1. 按照学习类型 - **监督学习**&#xff1a; - 线性回归&#xff08;Linear Regression&#xff09; …

华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接

文章目录 前言思路主要思路关于f函数的剖析Code就到这&#xff0c;铁子们下期见&#xff01;&#xff01;&#xff01;&#xff01; 前言 铁子们好啊&#xff01;今天阿辉又给大家来更新新一道好题&#xff0c;下面链接是23年9月27的华为笔试原题&#xff0c;LeetCode上面的ha…