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

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

  • 题94:
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【直接递归】
    • 2) 改进版一【函数递归】
    • 3) 改进版二【迭代遍历】
  • 4. 最优算法

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

题94:

1. 示例说明

  • 给定一个二叉树的根节点 root ,返回 它的 中序 遍历

    示例 1:

    img

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

    示例 2:

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

    示例 3:

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

    提示:

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

    进阶: 递归算法很简单,你可以通过迭代算法完成吗?


2. 题目解析

- 题意分解

  1. 本题为二叉树的中序遍历
  2. 基本的设计思路是采用递归,首先遍历左子树,然后访问根结点,最后遍历右子树

- 优化思路

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

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

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

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

    1. 可以考虑采用迭代法改写递归,提高性能

- 测量工具

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

3. 代码展开

1) 标准求解【直接递归】

直接写明中序遍历次序的递归,左子树、根、右子树写在一行上

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

import CheckFuncPerf as cfpclass Solution:def inorderTraversal_base(self, root):if not root:return []return self.inorderTraversal_base(root.left) + [root.val] + self.inorderTraversal_base(root.right)aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.inorderTraversal_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][0]))# 运行结果
函数 inorderTraversal_base 的运行时间为 654.17 ms;内存使用量为 8284.00 KB 执行结果 = 81

2) 改进版一【函数递归】

编写递归子函数,减少递归时缓存的资源

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

import CheckFuncPerf as cfpclass Solution:def inorderTraversal_ext1(self, root):def inOrder(root, result):if root == None:returninOrder(root.left, result)result.append(root.val)inOrder(root.right, result)result = []inOrder(root, result)return resultaSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.inorderTraversal_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][0]))# 运行结果
函数 inorderTraversal_ext1 的运行时间为 489.10 ms;内存使用量为 9556.00 KB 执行结果 = 81

3) 改进版二【迭代遍历】

采用堆栈来模拟递归,减少资源消耗

极速狂飙,超过98%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def inorderTraversal_ext2(self, root):if not root:return []list_stack = []result = []while root or list_stack:if root:list_stack.append(root)root = root.leftelse:curnode = list_stack.pop()result.append(curnode.val)root = curnode.rightreturn resultaSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.inorderTraversal_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][0]))# 运行结果
函数 inorderTraversal_ext2 的运行时间为 282.07 ms;内存使用量为 7436.00 KB 执行结果 = 81

4. 最优算法

根据本地日志分析,最优算法为第3种方式【迭代遍历】inorderTraversal_ext2

import random
ilen = 1000000
def generate_binary_tree(node_count):if node_count <= 0:return Noneroot = TreeNode(random.randint(1, 100))left = generate_binary_tree(node_count // 2)right = generate_binary_tree(node_count // 2)root.left = leftroot.right = rightreturn root
aroot = generate_binary_tree(ilen)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.inorderTraversal_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][0]))
result = cfp.getTimeMemoryStr(Solution.inorderTraversal_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][0]))
result = cfp.getTimeMemoryStr(Solution.inorderTraversal_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'][0]))# 算法本地速度实测比较
函数 inorderTraversal_base 的运行时间为 654.17 ms;内存使用量为 8284.00 KB 执行结果 = 81
函数 inorderTraversal_ext1 的运行时间为 489.10 ms;内存使用量为 9556.00 KB 执行结果 = 81
函数 inorderTraversal_ext2 的运行时间为 282.07 ms;内存使用量为 7436.00 KB 执行结果 = 81

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

may the odds be ever in your favor ~

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

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

相关文章

【使用IDEA总结】01——新增作者信息、方法参数返回值

[TOC](目录) 1.类新增作者信息 打开IDEA的Settings&#xff0c;Editor->Code Style->File and Code Templates->Includes->File Header&#xff0c;输入以下作者信息&#xff0c;作者名更换为自己的即可&#xff0c;操作如下图所示 /*** Author Linhaipeng* Date…

MySQL 基础知识(三)之数据库操作

目录 1 显示当前时间、用户名、数据库版本 2 查看已有数据库 3 创建数据库 4 使用数据库 5 查看当前使用的数据库 6 查看当前数据库信息 7 查看数据库编码 8 修改数据库信息 9 删除数据库 10 查看最大连接数 11 查看数据库当前连接数&#xff0c;并发数 12 查看数据…

C++类和对象-C++对象模型和this指针->成员变量和成员函数分开存储、this指针概念、空指针访问成员函数、const修饰成员函数

#include<iostream> using namespace std; //成员变量 和 成员函数 分开储存的 class Person { public: Person() { mA 0; } //非静态成员变量占对象空间 int mA; //静态成员变量不占对象空间 static int mB; //函数也不占对象空间…

抽象的前端

问题背景&#xff1a;vue3&#xff0c;axios 直接导致问题&#xff1a;路由渲染失败 问题报错&#xff1a;Uncaught SyntaxError: The requested module /node_modules/.vite/deps/axios.js?v7bee3286 does not provide an export named post (at LoginIn.vue:16:9) 引入组…

C++ //练习 7.3 修改7.1.1节(第229页)的交易处理程序,令其使用这些成员。

C Primer&#xff08;第5版&#xff09; 练习 7.3 练习 7.3 修改7.1.1节&#xff08;第229页&#xff09;的交易处理程序&#xff0c;令其使用这些成员。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********************…

淘宝项目实战相关知识点

淘宝各个方面的布局大部分都是常规操作&#xff0c;在这里我就简单记录一下练习过程中的相关知识点&#xff0c;比较简短。相关知识点如下&#xff1a; 行高的取值 假设font-size为16px line-height:normal; line-height:1.5;24px&#xff0c;先继承后计算 line-height:200%;3…

Java并发基础:Exchanger全面解析!

内容概要 Exchanger类的优点在于能够简洁高效地实现两个线程间的数据交换&#xff0c;通过Exchanger&#xff0c;开发者可以避免复杂的锁和同步机制&#xff0c;降低并发编程的难度&#xff0c;同时&#xff0c;它还提供了线程安全的数据交换保障&#xff0c;使得多线程协作更…

android 控制台输出 缺失

问题 android 控制台输出内容缺失 详细问题 笔者进行android开发&#xff0c;期望控制台打印Log日志或是输出内容 Log.i("tag","content");或 System.out.println("content")但是实际上&#xff0c;上述内容并没有按照笔者期望打印 解决方…

2024 年 7 款最佳电脑录屏软件 [免费和付费]

录屏是捕获桌面上活动的软件应用程序。用户可以根据自己的要求创建视频记录。免费屏幕录像机广泛用于演示、演示、教程、游戏等。 录音机还有助于内容创建、远程协作和员工培训。这些录音机具有多种特性和功能。它提供了音频录制、网络摄像头集成和快速编辑工具的选项。您可以根…

跟廖雪峰老师学习Git(持续更新)

Git简介 创建版本库 第一步&#xff0c;创建一个新目录 第二步&#xff0c;通过git init变成Git可以管理的仓库 把文件添加到文本库&#xff0c;不要使用Windows自带的记事本&#xff01; 我用的是VS code 创建readme.txt 放入库中 commit可以一次提交很多文件&#xff0…

点云旋转处理

实现代码为&#xff1a; //以中心化点进行旋转double theta atan(maindirection.a);//计算的是弧度单位for (int i 0; i < origipts.size(); i){pcl::PointXYZ tempone;tempone.x aftercenerlizepts[i].x*cos(theta) aftercenerlizepts[i].y*sin(theta) center.x;temp…

专业140+总分420+东北大学841通信专业基础考研经验东大电子信息与通信工程,真题,大纲,参考书。

今年考研顺利上岸&#xff0c;被东北大学通信工程录取&#xff0c;其中专业课841通信专业基础140&#xff0c;数二140&#xff0c;总分420&#xff0c;整体每门课都还是比较均衡&#xff0c;刚开始考研前也和大家一样&#xff0c;焦虑&#xff0c;紧张&#xff0c;面对考研怕失…

Web课程学习笔记--CSS-Sprite的应用

雪碧图CSS Sprite的应用 CSS雪碧&#xff0c;即CSS Sprite&#xff0c;也有人叫它CSS精灵&#xff0c;是一种CSS图像合并技术&#xff0c;该方法是将小图标和背景图像合并到一张图片上&#xff0c;然后利用css的背景定位来显示需要显示的图片部分。例如常见的商品分类导航其实所…

阿里云游戏服务器一年费用多少?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

云备份项目:在云端保护您的数据【二、开发】

☘️过度的信息对一个过着充实生活的人来说&#xff0c;是一种不必要的负担☘️ 文章目录 前言工具类实现文件实用工具类代码实现 Json实用工具类代码实现 服务端单例配置类系统配置信息单例配置类 数据管理类数据信息数据管理 热点管理类业务处理类 客户端数据管理类文件备份类…

软件测试【三】Python中的数据类型

一、Python中的数据类型: python中的list列表定义 在Python中&#xff0c;list是一种有序的数据类型&#xff0c;可以存储任意类型的对象&#xff0c;包括数字、字符串、布尔值、函数等。 定义一个list列表可以使用中括号[]来表示&#xff0c;其中每个元素之间用逗号隔开。以…

anomalib1.0学习纪实

回顾&#xff1a;细分、纵深、高端、上游、积累、极致。 回顾&#xff1a;产品化&#xff0c;资本化&#xff0c;规模化&#xff0c;大干快上&#xff0c;小农思维必死无疑。 春节在深圳新地中央&#xff0c;学习anomalib1.0。 一、安装&#xff1a; 1、常规安装 采用的是…

蓝桥杯:C++排列与组合

排列是暴力枚举时的常见操作。有以下两种情况。 C的 next_permutation()是全排列函数&#xff0c;只能输出序列中所有元素的全排列。 本节将给出手写排列和组合的代码。因为在很多场合中不能使用系统自带的排列函数&#xff0c;所以需要自己编写。 全排列函数&#xff1a;nex…

SpringCloud之Eureka注册中心和负载均衡

SpringCloud之Eureka注册中心和负载均衡 微服务技术栈认识微服务单体架构分布式架构微服务 微服务拆分及远程调用微服务拆分注意事项 Eureka注册中心提供者与消费者原理分析服务调用出现的问题Eureka的作用 使用流程1、搭建EurekaServer2、注册user-service3、在order-service完…

BUGKU-WEB 你必须让他停下

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 图片会消失,那应该是使用了js来控制根据提示,那就是要停止js才会看到flag (也就是要抓包,不要陷入停止js的思维) 相关工具 F12大法Burp Suit抓包工具 解题步骤 出现图片的时候,源码中确实出现…