当前位置: 首页 > news >正文

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 cfp

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

class Solution:
 def inorderTraversal_ext1(self, root):
     def inOrder(root, result):
         if root == None:
             return
         inOrder(root.left, result)
         result.append(root.val)
         inOrder(root.right, result)
     result = []
     inOrder(root, result)
     return result

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

class 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.left
         else:
             curnode = list_stack.pop()
             result.append(curnode.val)
             root = curnode.right

     return result

aSolution = 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 None
    root = TreeNode(random.randint(1, 100))
    left = generate_binary_tree(node_count // 2)
    right = generate_binary_tree(node_count // 2)
    root.left = left
    root.right = right
    return 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 ~

相关文章:

  • Vue3快速上手(三)Composition组合式API及setup用法
  • 【芯片设计- RTL 数字逻辑设计入门 15 -- 函数实现数据大小端转换】
  • PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证
  • 如何使用六图一表七种武器
  • 网络安全的今年:量子、生成人工智能以及 LLM 和密码
  • 【Android-Gradle】多模块开发中,定义额外属性(全局变量),穿梭在不同的Gradle文件中(kotlin脚本版)
  • 使用二分查找优化时间复杂度
  • Transformer的PyTorch实现之若干问题探讨(一)
  • ubuntu下如何查看显卡及显卡驱动
  • php 如何判断是否上传了文件、图片
  • CGAL::2D Arrangements-5
  • Chrome 沙箱逃逸 -- Plaid CTF 2020 mojo
  • APIfox自动化编排场景(二)
  • Codeforces Round 923 (Div. 3) C. Choose the Different Ones(Java)
  • 【MATLAB】GA_BP神经网络回归预测算法
  • 基于51 单片机的交通灯系统 源码+仿真+ppt
  • LoRA:语言模型微调的计算资源优化策略
  • 树莓派4B(Raspberry Pi 4B)使用docker搭建springBoot/springCloud服务
  • Java玩转《啊哈算法》纸牌游戏之小猫钓鱼
  • CSP-动态规划-最长公共子序列(LCS)
  • 李强签署国务院令,公布修订后的《中华人民共和国植物新品种保护条例》
  • 今年五一假期出游人群规模预计比去年提升8%,哪里最热门?
  • 解放日报:这是一场需要定力和实力的“科技长征”
  • 中国人寿一季度净利润288亿增39.5%,营收降8.9%
  • 成都世运会倒计时100天,中国代表团运动员规模将创新高
  • 王星昊再胜连笑,夺得中国围棋天元赛冠军