Python算法题集_翻转二叉树

 Python算法题集_翻转二叉树

  • 题226:翻转二叉树
  • 1. 示例说明
  • 2. 题目解析
    • - 题意分解
    • - 优化思路
    • - 测量工具
  • 3. 代码展开
    • 1) 标准求解【DFS递归】
    • 2) 改进版一【BFS迭代,节点循环】
    • 3) 改进版二【BFS迭代,列表循环】
  • 4. 最优算法

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

题226:翻转二叉树

1. 示例说明

  • 示例 1:

    在这里插入图片描述

    输入:root = [4,2,7,1,3,6,9]
    输出:[4,7,2,9,6,3,1]
    

    示例 2:

    在这里插入图片描述

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

    示例 3:

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

    提示:

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

2. 题目解析

- 题意分解

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

- 优化思路

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

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

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

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

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

- 测量工具

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

3. 代码展开

1) 标准求解【DFS递归】

采用深度优先算法,标准递归实现

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

import CheckFuncPerf as cfpclass Solution:def invertTree_base(self, root):if not root:return Noneroot.left, root.right = root.right, root.leftself.invertTree_base(root.left)self.invertTree_base(root.right)return rootaroot = generate_binary_tree(ilen)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.invertTree_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 运行结果
函数 invertTree_base 的运行时间为 600.12 ms;内存使用量为 4.00 KB 执行结果 = 71

2) 改进版一【BFS迭代,节点循环】

通过堆栈结构的迭代算法来改写递归算法,单次循环一个节点

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

import CheckFuncPerf as cfpclass Solution:def invertTree_ext1(self, root):if not root:return Nonestacktree = [root]while stacktree:tmpnode = stacktree.pop()tmpnode.left, tmpnode.right = tmpnode.right, tmpnode.leftif tmpnode.right:stacktree.append(tmpnode.right)if tmpnode.left:stacktree.append(tmpnode.left)return rootaroot = generate_binary_tree(ilen)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.invertTree_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 运行结果
函数 invertTree_ext1 的运行时间为 546.13 ms;内存使用量为 0.00 KB 执行结果 = 7

3) 改进版二【BFS迭代,列表循环】

通过队列结构的迭代算法来改写递归算法,每次循环一个批次,减少了部分循环判断计算

勉强通关,超过19%在这里插入图片描述

import CheckFuncPerf as cfpclass Solution:def invertTree_ext2(self, root):if not root:return NonequeueTree = [root]while queueTree:for iIdx in range(len(queueTree)):tmpnode = queueTree.pop()tmpnode.left, tmpnode.right = tmpnode.right, tmpnode.leftif tmpnode.left:queueTree.append(tmpnode.left)if tmpnode.right:queueTree.append(tmpnode.right)return rootaroot = generate_binary_tree(ilen)
aSolution = Solution()
result = cfp.getTimeMemoryStr(Solution.invertTree_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 运行结果
函数 invertTree_ext2 的运行时间为 471.11 ms;内存使用量为 0.00 KB 执行结果 = 21

4. 最优算法

根据本地日志分析,最优算法为第3种方式【BFS迭代,列表循环】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.invertTree_base, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))
aroot = generate_binary_tree(ilen)
result = cfp.getTimeMemoryStr(Solution.invertTree_ext1, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))
aroot = generate_binary_tree(ilen)
result = cfp.getTimeMemoryStr(Solution.invertTree_ext2, aSolution, aroot)
print(result['msg'], '执行结果 = {}'.format(result['result'].val))# 算法本地速度实测比较
函数 invertTree_base 的运行时间为 600.12 ms;内存使用量为 4.00 KB 执行结果 = 71
函数 invertTree_ext1 的运行时间为 546.13 ms;内存使用量为 0.00 KB 执行结果 = 7
函数 invertTree_ext2 的运行时间为 471.11 ms;内存使用量为 0.00 KB 执行结果 = 21

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

may the odds be ever in your favor ~

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

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

相关文章

Spring Boot 笔记 019 创建接口_文件上传

1.1 创建阿里OSS bucket OSS Java SDK 兼容性和示例代码_对象存储(OSS)-阿里云帮助中心 (aliyun.com) 1.2 编写工具类 package com.geji.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun…

加速创新如何先从创意管理开始?

文章详细介绍了什么是创意管理以及它在组织中的重要性和最佳实践。创意管理是指在组织内捕捉、组织、评估和实施创意的过程。它通过建立一个结构化的系统&#xff0c;从员工、客户或其他利益相关者那里收集创意&#xff0c;并系统地审查和选择最有前景的创意进行进一步的开发或…

算法学习——LeetCode力扣回溯篇3

算法学习——LeetCode力扣回溯篇3 491. 非递减子序列 491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。…

RabbitMQ——构建高性能消息传递的应用

前言 大家好&#xff0c;我是chowley&#xff0c;说到消息队列&#xff0c;在我之前的生产者-消费者项目中使用的是ConCurrentLinkedList结构&#xff0c;今天来总结一下主流的消息队列实现——RabbitMQ。 RabbitMQ 是一个开源的消息代理软件&#xff0c;最初由 Rabbit Techn…

2024龙年特别篇 -- 魔法指针 之 指针变量的意义 指针运算

学习完指针变量&#xff1a;链接后&#xff0c; 我们继续学习指针变量的应用 目录 程序展示 原始方式 指针变量方式 代码对比 指针运算 指针-整数 用指针打印数组内容 使用指针打印1-10中的奇数 指针-指针 指针的关系运算 程序展示 打印一个有10个元素的数组&am…

语言与科技创新(大语言模型对科技创新的影响)

1.科技创新中的语言因素 科技创新中的语言因素至关重要&#xff0c;具体体现在以下几个方面&#xff1a; 科技文献交流&#xff1a; 英语作为全球科学研究的通用语言&#xff0c;极大地推动了科技成果的国际传播与合作。科学家们在发表论文、报告研究成果时&#xff0c;大多选…

ChatGPT高效提问—prompt实践(教师助手)

ChatGPT高效提问—prompt实践&#xff08;教师助手&#xff09; 下面来看看ChatGPT在教育领域有什么用途。 首先设定ChatGPT的角色为高中教师助手。 输入prompt: ChatGPT输出&#xff1a; ​ 教师助手的角色已经设置完成。下面通过几种不同的情景演示如何使用。 1.1.1 制定…

Day34 贪心算法part03

K次取反后最大化的数组和 for num in nums:if k 0:breakif num < 0:num -numk - 1 这种直接遍历元素的赋值的话不改变数组里面的数&#xff01; 得写成下面这个样子 for i in range(len(nums)):if k 0:breakif nums[i] < 0:nums[i] -nums[i]k - 1 A.sort(keylambda …

2001-2022年368个地级市平均气温数据

2001-2022年368个地级市平均气温数据 1、时间:2001-2022年 2、范围&#xff1a;368个地级市 3、来源&#xff1a;基于NOAA下属NCEI提供的原始数据编制而成的。 4、指标&#xff1a;年份、省份、省份代码、城市、城市代码、平均气温 5、指标解释&#xff1a;平均气温指某一…

设计模式浅析

一、设计模式的使用场景 设计模式&#xff08;Design Patterns&#xff09;是在软件开发中经过验证的最佳实践&#xff0c;用于解决常见的设计问题。它们提供了一种可复用的解决方案&#xff0c;可以帮助开发人员提高代码质量、可维护性和可重用性。设计模式的采用通常在以下情…

【JavaEE】_JavaScript(Web API)

目录 1. DOM 1.1 DOM基本概念 1.2 DOM树 2. 选中页面元素 2.1 querySelector 2.2 querySelectorAll 3. 事件 3.1 基本概念 3.2 事件的三要素 3.3 示例 4.操作元素 4.1 获取/修改元素内容 4.2 获取/修改元素属性 4.3 获取/修改表单元素属性 4.3.1 value&#xf…

机器学习、深度学习、强化学习、迁移学习的关联与区别

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要了解并初步探究机器学习、深度学习、强化学习、迁移学习的关系与区别&#xff0c;通过清晰直观的关系图展现出四种“学习”之间的关系。虽然这四种“学习”方法在理论和应用上存在着一定的区别&#xff0c;但它们之间也…

Python学习之路-爬虫进阶:爬虫框架

Python学习之路-爬虫进阶:爬虫框架 了解框架 什么是框架 框架是为了为解决一类问题而开发的程序&#xff0c;框架两个字可以分开理解&#xff0c;框&#xff1a;表示指定解决问题的边界&#xff0c;明确要解决的问题&#xff1b;架&#xff1a;表达的是能够提供一定的支撑性…

FreeRTOS 队列管理

概览 基于 FreeRTOS 的应用程序由一组独立的任务构成——每个任务都是具有独立权 限的小程序。这些独立的任务之间很可能会通过相互通信以提供有用的系统功能。 FreeRTOS 中所有的通信与同步机制都是基于队列实现的。 本章期望让读者了解以下事情   如何创建一个队列   …

Starknet 的 JavaScript 库:Starknet.js、get-starknet和starknet-react

文章目录 Starknet 的 JavaScript 库Starknet.jsget-starknetstarknet-reactStarknet 的 JavaScript 库Starknet.js 官方:https://www.starknetjs.com/ Starknet.js 是一个与 Starknet 交互的 JavaScript 库,通常以脚本或去中心化形式进行交互应用程序。 Starknet.js 的灵感…

有限合伙协议书(模板)下

第六章 合伙事务的执行 第十七条 有限合伙人不执行合伙事务&#xff0c;对外不具有代表权。有限合伙企业由普通合伙人执行合伙事务。 第十八条 经全体合伙人一致同意可以委托一个普通合伙人&#xff08;也可以委托数个普通合伙人&#xff09;对外代表合伙企业&#xff0c;执…

【PyTorch】PyTorch中张量(Tensor)统计操作

PyTorch深度学习总结 第五章 PyTorch中张量(Tensor)统计操作 文章目录 PyTorch深度学习总结前言一、最值查找二、特殊值查询 前言 上文介绍了PyTorch中张量(Tensor)的计算操作&#xff0c;本文将介绍张量的统计操作。 一、最值查找 函数描述torch.max()找出张量中的最大值to…

Hive调优——count distinct去重优化

离线数仓开发过程中经常会对数据去重后聚合统计&#xff0c;而对于大数据量来说&#xff0c;count(distinct ) 操作消耗资源且查询性能很慢&#xff0c;以下是调优的方式。 解决方案一&#xff1a;group by 替代 原sql 如下&#xff1a; #7日、14日的app点击的用户数&#x…

C#面:<%# %>和<% %>有什么区别?

<%# %>和<% %>是ASP.NET中的两种不同的代码块标记。 <%# %> 是数据绑定表达式标记&#xff0c;用于在页面中绑定数据。它通常用于数据绑定控件&#xff08;如GridView、Repeater等&#xff09;&#xff0c;用于将数据源中的值绑定到控件的属性或者显示在页…

算法学习——LeetCode力扣回溯篇1

算法学习——LeetCode力扣回溯篇1 77. 组合 77. 组合 - 力扣&#xff08;LeetCode&#xff09; 描述 任何顺序 返回答案。 示例 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2&#xff1a; 输…