二叉树的前,中,后序遍历(递归法和迭代法) Python

二叉树的前序遍历

递归法:

# 定义二叉树节点的类
# class TreeNode:
#    def __init__(self, x):
#        self.val == x
#        self.left == None
#        self.right == Noneclass Solution:def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []  # 用于存储前序遍历结果的列表# 定义一个递归函数,实现前序遍历def pre_order(root):if not root:  # 如果当前节点为空,则返回return res.append(root.val)  # 将当前节点的值加入到结果列表中pre_order(root.left)  # 递归遍历左子树pre_order(root.right)  # 递归遍历右子树pre_order(root)  # 调用递归函数进行前序遍历return res  # 返回前序遍历结果的列表

迭代法:

class Solution:def preorderTraversal(self, root: TreeNode) -> List[int]:# 如果根结点为空,则返回空列表if not root:return []stack = [root]  # 把根节点存放在栈里result = []  # 用于存储遍历结果while stack:  # 如果栈不为空node = stack.pop()  # 从栈中弹出一个结点result.append(node.val)  # 将当前结点的值加入结果列表,这里是先序遍历,所以先处理中结点if node.right:  # 如果有右孩子,则先将右孩子入栈,因为栈是先进后出的结构,所以右孩子会后处理stack.append(node.right)if node.left:  # 如果有左孩子,则将左孩子入栈,因为左孩子要后处理stack.append(node.left)return result  # 返回先序遍历结果

二叉树的中序遍历:

递归法:

# 定义二叉树节点的类
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = rightclass Solution:def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []# 定义一个中序遍历的辅助函数def in_order(root):# 如果当前节点为空,直接返回if not root:return# 递归遍历左子树in_order(root.left)# 将当前节点的值加入结果列表res.append(root.val)# 递归遍历右子树in_order(root.right)# 调用中序遍历函数in_order(root)# 返回结果列表return res

迭代法:

# 中序遍历-迭代-LC94_二叉树的中序遍历
class Solution:def inorderTraversal(self, root: TreeNode) -> List[int]:if not root:return []stack = []  # 不能提前将root结点加入stack中res = []cur = rootwhile cur or stack:  # 当当前结点不为空或栈不为空时循环if cur:  # 如果当前结点不为空stack.append(cur)  # 将当前结点压入栈中cur = cur.left  # 将当前结点移动到左子结点else:  # 如果当前结点为空cur = stack.pop()  # 弹出栈顶结点并将其赋给当前结点res = cur.right  # 将当前结点移动到右子结点return res  # 返回中序遍历结果列表

二叉树的后续遍历:

递归法:

class Solution:def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []# 定义一个后序遍历的辅助函数def post_order(root):# 如果当前节点为空,直接返回if not root:return# 递归遍历左子树post_order(root.left)# 递归遍历右子树post_order(root.right)# 将当前节点的值加入结果列表res.append(root.val)# 调用后序遍历函数post_order(root)# 返回结果列表return res

迭代法:

后序遍历的迭代法跟前序类似,前序是中,左,右的顺序    后序是左,右,中的顺序, 只需把前序的左跟右换个位置再把取出来的元素逆序排序就行了

# 定义一个二叉树节点
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = rightclass Solution:def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:# 如果根节点为空,直接返回空列表if not root:return []# 初始化结果列表和栈res = []stack = [root]# 循环直到栈为空while stack:# 弹出栈顶节点node = stack.pop()# 将节点值加入结果列表res.append(node.val)# 如果有左子节点,将左子节点加入栈if node.left:stack.append(node.left)# 如果有右子节点,将右子节点加入栈if node.right:stack.append(node.right)           # 返回结果列表的逆序(即后序遍历的顺序)return res[::-1]

 

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

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

相关文章

【pytest】执行环境切换的两种解决方案

一、痛点分析 在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环境等等,并且在DevOps理念中,往往自动化都会与Jenkins进行CI/CD,不论是定时执行策略…

SQL解惑 - 谜题2

文章目录 一、谜题描述二、分析三、答案四、总结 一、谜题描述 创建一个记录雇员缺勤率的数据库。使用的表结构如下:Absenteeism 主键:PRIMARY KEY (emp_id, absent_date) 字段名字段类型字段中文名字段描述emp_idINTERGER雇员id-absent_dateSTRING缺勤…

【数据中台】开源项目(5)-Amoro

介绍 Amoro is a Lakehouse management system built on open data lake formats. Working with compute engines including Flink, Spark, and Trino, Amoro brings pluggable and self-managed features for Lakehouse to provide out-of-the-box data warehouse experience,…

SQL优化的面试题

1. **针对慢查询进行性能优化**: - 使用数据库提供的工具(如MySQL的EXPLAIN语句)分析查询计划,找出潜在的性能问题。 - 优化查询语句的结构,确保索引被充分利用。 - 对于大表,考虑分页或缓存部分结…

6-2 统计大于等于平均分人数

函数 fun 的功能是:从m个学生的成绩中统计出高于和等于平均分的学生人数, 此人数由函数值返回。平均分通过形参传回,输入学生成绩时, 用-1结束输入,由程序自动统计学生人数。 函数接口定义: int fun ( fl…

【无标题】AttributeError: module ‘gradio‘ has no attribute ‘outputs‘

问题描述 AttributeError: module gradio has no attribute outputs 不知道作者用的是哪个gradio版本,最新的版本报错AttributeError: module gradio has no attribute outputs , 换一个老一点的版本会报错AttributeError: module gradio has no attribu…

软件工程(9-10章、11章、12章、13章小测)参考答案

软件工程9-10章小测 一 单项选择题(8分) 1、软件体系结构定义为()(1分) {component, connector, configuration} {models, connector} {object, collaboration, message, } 正确答案:{component, connector, config…

指针常量和常量指针的区别

文章目录 指针常量常量指针即是指针常量又是常量指针 指针常量 指针常量的本质是常量,表示的是 这个指针所指向的地址不能发生改变。即指针变量的值(即地址值)不能发生修改。但是指针所指向的那块内存里的值是可以修改的。 注意:…

canvas基础:绘制圆弧、圆形

canvas实例应用100 专栏提供canvas的基础知识,高级动画,相关应用扩展等信息。 canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重要的帮助。 文章目录 arc…

【大数据】HBase 中的列和列族

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 &#x…

K8S客户端二 使用Rancher部署服务

Rancher容器云管理平台 本博客中使用了四台服务器,如下 rancher服务器k8s-masterk8s-worker01k8s-worker02 一、主机硬件说明 序号硬件操作及内核1CPU 4 Memory 4G Disk 100GCentOS72CPU 4 Memory 4G Disk 100GCentOS73CPU 4 Memory 4G Disk 100GCentOS74CPU 4 …

Linux的基本指令(五)

目录 前言 tar指令(重要) 再次思考,为什么要打包和压缩呢? 实例:基于xshell进行压缩包在Windows与Linux之间的互传 实例:实现两个Linux系统之间的文件互传 bc指令 uname -r指令 重要的热键 关机与开机 扩展命令 shell及…

国际语音群呼系统的产品优势有哪些?为什么要使用国际语音群呼系统?

一、国际语音群呼系统的产品优势: 1.巨量群呼 支持大容量并发群呼,呼叫不受限制,充裕的线路保障造就百万级平台容量,可以短时间内同时拨打大量电话,让语音快速到达,大大提高发送效率; 2.自主…

WSL2 Linux22.04 图形化界面配置

Windows10/11 三步安装wsl2 Ubuntu20.04(任意盘) - 知乎 22.04需要将appxbundle改后缀名为zip,选出x64解压再改后缀名,再按上面文章操作 ubuntu 22.04国内镜像阿里云/163源/清华大学/中科大 WSL2 Ubuntugnome图形界面的安装血泪史&#xf…

Android12蓝牙框架

参考: https://evilpan.com/2021/07/11/android-bt/ https://source.android.com/docs/core/connect/bluetooth?hlzh-cn https://developer.android.com/guide/topics/connectivity/bluetooth?hlzh-cn https://developer.android.com/guide/components/intents-fi…

FL Studio Producer Edition21.0.3中文版安装详解(附下载链接)

fl studio 21中文版是Image-Line公司继20版本之后更新的水果音乐制作软件,很多用户不太理解,为什么新版本不叫fl studio 21或fl studio2024,非得直接跳到21.2版本,其实该版本是为了纪念该公司22周年,所以该版本也是推出…

点云从入门到精通技术详解100篇-基于三维点云的工件曲面轮廓检测与机器人打磨轨迹规划(下)

目录 4.3 机器人打磨轨迹规划 4.3.1 机器人运动学建模与分析 4.3.2 机器人轨迹规划算法

C++生成静态库和动态库

什么是静态库和动态库 在项目开发中,或多或少地需要使用到第三方(非编译器提供)的程序库,使用第三方的程序库能够减少重复造轮子的工作,提高开发效率。本文将介绍如何把自己的写的程序制作为程序库提供给他人使用&…

Android 13 - Media框架(18)- CodecBase

从这一节开始我们会回到上层来看ACodec的实现,在这之前我们会先了解ACodec的基类CodecBase。CodecBase.h 中除了声明有自身接口外,还定义有内部类 CodecCallback、BufferCallback,以及另一个基类 BufferChannelBase,接下来我们会一…

mysql基本命令

MySQL 是一个流行的关系型数据库管理系统,以下是一些常用的 MySQL 基本命令: 连接到 MySQL 服务器: mysql -u [username] -p [password]其中 [username] 是你的 MySQL 用户名,[password] 是对应的密码。执行该命令后&#xff0c…