【二叉树】遍历总结!

news2025/1/23 6:08:57

在很多问题中,熟练掌握二叉树的遍历方法,能够轻松解决很多问题。

新建一棵二叉树root=[1,null,2,3]

1、前序遍历

前序遍历的顺序为根节点->左子树->右子树,按照以上二叉树,遍历顺序为[1,2,3]。代码为:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        def traversal(node):
            if node == None:
                return
            result.append(node.val) 
            traversal(node.left)        
            traversal(node.right)
        traversal(root)
        return result

使用迭代实现代码为:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def inorderTraversal(self, root: Optional[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

2、中序遍历

中序遍历的顺序为左子树->根节点->右子树,按照以上二叉树,遍历顺序为[1,3,2]。代码为:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        def traversal(node):
            if node == None:
                return 
            traversal(node.left)
            result.append(node.val)
            traversal(node.right)
        traversal(root)
        return result

使用迭代实现代码为:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        stack = []
        result = []
        while stack or root:
            while root:
                stack.append(root)
                root = root.left
            root = stack.pop()
            result.append(root.val)
            root = root.right
        return result

3、后序遍历

后序遍历的顺序为左子树->右子树->根节点,按照以上二叉树,遍历顺序为[3,2,1]。代码为:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        def traversal(node):
            if node == None:
                return
            traversal(node.left)
            traversal(node.right)
            result.append(node.val) 
        traversal(root)
        return result

使用迭代实现代码为:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        stack = [root]
        result = []
        while stack:
            node = stack.pop()
            result.insert(0,node.val)
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
        return result

4、总结

遍历方式顺序特点与应用场景
前序遍历根 -> 左 -> 右适合复制二叉树、计算前缀表达式等。
中序遍历根 -> 左 -> 右对二叉搜索树(BST)进行中序遍历,结果是有序的。常用于排序或验证二叉搜索树。
后序遍历左 -> 右 -> 根适合删除二叉树、计算后缀表达式等。

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

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

相关文章

(2)STM32 USB设备开发-USB虚拟串口

例程:STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为USB虚拟串口教程,没有知识,全是实操,按照步骤就能获得一个STM32的USB虚拟串口。本例子是在野火F103MINI开发板上验证的,如果代码中出现一些外设的…

ASP .NET Core 学习(.NET9)部署(一)windows

在windows部署 ASP .NET Core 的时候IIS是不二选择 一、IIS安装 不论是在window7 、w10还是Windows Server,都是十分简单的,下面以Windows10为例 打开控制面版—程序—启用或关闭Windows功能 勾选图中的两项,其中的子项看需求自行勾选&am…

Java并发编程面试题:线程池Fork/Join(19题)

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

fyne 选项卡设计

用户界面的设计至关重要,它直接影响着用户体验。选卡设计作为一种常见的界面布局方式,能够有效地组织和展示信息,使用户能够方便快捷地浏览和操作。 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架,它提供了丰富的组件和功能&#…

MySQL——主从同步

提醒:进行配置时,需要确保一主两从的操作系统、MySQL版本一致,否则将出现问题 环境介绍 服务器IP主服务器172.25.254.10从服务器-1172.25.254.11从服务器-2172.25.254.12 配置 # 快速配置,选择多重执行,确保版本一…

IDEA中Maven使用的踩坑与最佳实践

文章目录 IDEA中Maven使用的踩坑与最佳实践一、环境配置类问题1. Maven环境配置2. IDEA中Maven配置建议 二、常见问题与解决方案1. 依赖下载失败2. 依赖冲突解决3. 编译问题修复 三、效率提升技巧1. IDEA Maven Helper插件使用2. 常用Maven命令配置3. 多模块项目配置4. 资源文件…

VIVADO-block desgn 中时钟连线报错

问题描述 1.自定义的IP核由于封装不规范,输出的时钟引脚缺少该时钟的相关信息 正常时钟引脚属性 异常的时钟引脚属性 2.run connection automation 中无法找到这种缺少信息的时钟源 3.axi_clk与axi interconnect时钟频率不匹配 解决方案: 1.用BUFG将缺少…

CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅

CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅 🌟 默语,是一位在技术分享与社区建设中坚持深耕的博客作者。今年,我有幸再次入围成为 CSDN 博客之星TOP300 的一员,这既是对过往努力的肯定,也是对未来探…

BUUCTF_Web(UPLOAD COURSE 1)

打开靶机,发现需要上传文件,尝试一句话木马蚁剑链接 一句话木马 【基本原理】利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以在本地通过中国菜刀chopper.exe即可获取和控制整个网站目录。表示后面即使执行错误&#…

车载软件架构 --- CP和AP作为中央计算平台的软件架构双核心

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…

docker ubuntu:20.04构建c++ grpc环境

由c grpc必须源码编译,ubuntu版本不同可能出现的问题也不同,这里分享下我的构建过程。 我是vscode结合docker去安装c虚拟环境,我不想污染本机环境。 vscode的插件Dev Containers Dockerfile如下(如果单纯是ubuntu环境构建,可忽略该…

PV-RCNN、PV-RCNN++ 网络结构

paper: PV-RCNN https://arxiv.org/abs/1912.13192PV-RCNN https://arxiv.org/abs/2102.00463 github:使用OpenPCDet进行训练测试 https://github.com/open-mmlab/OpenPCDet PV-RCNN 简介 PV-RCNN的提出是想要综合 point-based 和 voxel-based 3D目…

认识c++

文章目录 1namespace 写博客 ,做作业 笔记很关键 1namespace ::域作用限定域 局部域>全局域>命名空间域(展开了命名空间域or指定访问命名空间域) 不要轻易展开 可以这样解决 方案一 方案二 using namespace std; 直接展开会有风…

接口 V2 完善:基于责任链模式、Canal 监听 Binlog 实现数据库、缓存的库存最终一致性

🎯 本文介绍了一种使用Canal监听MySQL Binlog实现数据库与缓存最终一致性的方案。文章首先讲解了如何修改Canal配置以适应订单表和时间段表的变化,然后详细描述了通过责任链模式优化消息处理逻辑的方法,确保能够灵活应对不同数据表的更新需求…

内容中台实施最佳实践解析与应用指南

内容概要 内容中台是一个旨在提升企业内容管理与分发能力的战略性平台,其实施最佳实践对于企业在数字化转型中尤为重要。内容中台的建设,不仅涉及技术层面的架构设计,还需结合组织变革、业务流程优化等多个方面,以实现高效、灵活…

顺序表和链表(详解)

线性表 线性表( linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。…

TCP全连接队列

1. 理解 int listen(int sockfd, int backlog) 第二个参数的作用 backlog:表示tcp全连接队列的连接个数1。 如果连接个数等于backlog1,后续连接就会失败,假设tcp连接个数为0,最大连接个数就为1,并且不accept获取连接…

C语言程序环境与预处理—从源文件到执行程序,这里面有怎么的工序?绝对0基础!

正文开始前,我们简单聊上一聊! 众所周知!编译器的功能非常强大的,我们在编译软件上敲的每一行代码,点击执行,就会输出结果,从代码-->输出结果,这中间经历了怎样的一个过程&#…

第35天:安全开发-JavaEE应用原生反序列化重写方法链条分析触发类类加载

时间轴: 序列化与反序列化图解: 演示案例: Java-原生使用-序列化&反序列化 Java-安全问题-重写方法&触发方法 Java-安全问题-可控其他类重写方法 Java-原生使用-序列化&反序列化 1.为什么进行序列化和反序列化&#xff1…

硬件作品3----STM32F103RCT6最小系统板MCU配置

参考文章:对stm32F103RCT6原理图解析(详细)-CSDN博客 本想绘制稍微复杂一些的电路,但是出现很多问题,因此先绘制一块最小系统板进行原理、绘制方法的验证。 设计难度:★ 适合人群:初学者 一、…