【数据结构】二叉树遍历

目录

一、二叉树的神秘面纱

二、二叉树遍历初相识

2.1 二叉树的基本结构

2.2 遍历的魔法规则

三、递归遍历:简洁而强大的力量

3.1 递归的奇妙思维

3.2 前序遍历的递归实现

3.3 中序遍历的递归实现

3.4 后序遍历的递归实现

四、迭代遍历:另辟蹊径的智慧

4.1 迭代与栈的完美结合

4.2 前序遍历的迭代实现

4.3 中序遍历的迭代实现

4.4 后序遍历的迭代实现

五、层序遍历:层次分明的探索

5.1 队列助力层序遍历

5.2 层序遍历的代码实现

六、实战演练:解决实际问题

6.1 示例问题 1:计算二叉树的节点数

6.2 示例问题 2:查找二叉树中的特定节点

七、总结与展望


一、二叉树的神秘面纱

        在数据结构的宏大版图中,二叉树无疑占据着举足轻重的地位。它就像是一座神秘的城堡,每个节点都是城堡中的房间,而连接节点的边则是房间之间的通道。二叉树的独特之处在于,每个节点最多有两个子节点,这种简洁而有序的结构,为众多复杂算法的实现奠定了基础。

        二叉树遍历,作为探索这座城堡的关键路径,在算法和编程领域发挥着核心作用。无论是在数据搜索、排序,还是在编译器设计、数据库索引构建等方面,二叉树遍历都扮演着不可或缺的角色。它是理解和解决许多实际问题的一把钥匙,掌握了二叉树遍历,就如同获得了开启数据结构宝库的密码,能够在信息的海洋中更加高效地航行。接下来,就让我们一起揭开二叉树遍历的神秘面纱,探索它的奇妙世界。

二、二叉树遍历初相识

2.1 二叉树的基本结构

        在深入探讨二叉树遍历之前,我们先来认识一下二叉树的基本结构。二叉树由一个根节点和两棵互不相交的左子树、右子树组成。每个节点都包含一个数据元素,以及指向左子树和右子树的指针(在实际编程中,指针可以是对象引用、内存地址等)。比如下面这个简单的二叉树:

1

/ \

2 3

/ \

4 5

        在这个二叉树中,节点 1 是根节点,它的左子树包含节点 2,右子树包含节点 3。节点 2 又有自己的左子树(节点 4)和右子树(节点 5) 。在 Python 中,我们可以用如下代码定义一个二叉树节点:

class TreeNode:

def __init__(self, val=0, left=None, right=None):

self.val = val

self.left = left

self.right = right

        这里TreeNode类表示二叉树的节点,val属性存储节点的数据,left和right属性分别指向左子节点和右子节点。通过这样的定义,我们就可以构建出各种复杂的二叉树结构。

2.2 遍历的魔法规则

        二叉树遍历,简单来说,就是按照一定的规则和顺序访问二叉树中的每一个节点,并且每个节点只被访问一次。这就像是在一个迷宫中寻找出口,我们需要遵循特定的路线,才能确保不会遗漏任何一个角落。根据访问节点顺序的不同,二叉树遍历主要分为以下四种方式:

        前序遍历:先访问根节点,再递归地前序遍历左子树,最后递归地前序遍历右子树,即 “根 - 左 - 右” 的顺序。对于前面的二叉树,前序遍历的结果是:1 2 4 5 3。用 Python 代码实现前序遍历如下:

def preorderTraversal(root):

if not root:

return []

return [root.val] + preorderTraversal(root.left) + preorderTraversal(root.right)

        中序遍历:先递归地中序遍历左子树,再访问根节点,最后递归地中序遍历右子树,即 “左 - 根 - 右” 的顺序。对于上述二叉树,中序遍历的结果是:4 2 5 1 3。中序遍历的 Python 实现代码如下:

def inorderTraversal(root):

if not root:

return []

return inorderTraversal(root.left) + [root.val] + inorderTraversal(root.right)

        后序遍历:先递归地后序遍历左子树,再递归地后序遍历右子树,最后访问根节点,即 “左 - 右 - 根” 的顺序。对于该二叉树,后序遍历的结果是:4 5 2 3 1。后序遍历的 Python 代码实现如下:

def postorderTraversal(root):

if not root:

return []

return postorderTraversal(root.left) + postorderTraversal(root.right) + [root.val]

        层序遍历:从根节点开始,按照层次从上到下,每一层从左到右的顺序访问节点。对于这个二叉树,层序遍历的结果是:1 2 3 4 5。层序遍历通常借助队列来实现,Python 代码如下:

from collections import deque

def levelOrderTraversal(root):

if not root:

return []

result, queue = [], deque([root])

while queue:

node = queue.popleft()

result.append(node.val)

if node.left:

queue.append(node.left)

if node.right:

queue.append(node.right)

return result

        通过这四种遍历方式,我们可以从不同的角度去探索二叉树的结构,获取其中存储的信息。不同的遍历方式在实际应用中有着各自的用途,比如中序遍历对于二叉搜索树来说,会得到一个有序的序列,这在很多搜索和排序相关的场景中非常有用;而层序遍历则常用于按层次处理树状结构的数据,如在图形渲染中处理场景的层级关系等 。

三、递归遍历:简洁而强大的力量

3.1 递归的奇妙思维

        递归,就像是一场神奇的冒险,它通过不断地将问题分解成更小的子问题,直到这些子问题变得足够简单,可以直接解决。在二叉树遍历中,递归的应用就如同在迷宫中找到一条清晰的路径,让我们能够轻松地访问每一个节点。

        递归的核心在于函数调用自身,这就像是一个人站在镜子前,镜子中的影像又不断地反射出更多的影像,形成一个层层嵌套的奇妙世界。在递归遍历二叉树时,我们首先设定一个基准情形,也就是递归结束的条件,比如当节点为空时,就不再继续递归。然后,在递归情形下,我们通过不断地调用自身,来处理左子树和右子树,就像沿着迷宫的不同路径不断探索一样 。

3.2 前序遍历的递归实现

        前序遍历的递归实现遵循 “根 - 左 - 右” 的顺序,就像是先打开城堡的大门(根节点),然后依次探索左边的房间(左子树)和右边的房间(右子树)。下面是 Python 实现的前序遍历递归代码:

def preorderTraversal(root):

if not root:

return []

return [root.val] + preorderTraversal(root.left) + preorderTraversal(root.right)

逐行解释一下这段代码:

        if not root::首先检查当前节点是否为空,如果为空,说明已经到达叶子节点或者没有节点,此时返回空列表[],这就是递归的结束条件,就像是在迷宫中走到了死胡同,需要返回。

        return [root.val] + preorderTraversal(root.left) + preorderTraversal(root.right):如果当前节点不为空,先将当前节点的值root.val添加到结果列表中,这就像是先访问城堡的大门。然后,通过递归调用preorderTraversal(root.left)来遍历左子树,接着递归调用preorderTraversal(root.right)来遍历右子树,这就像是依次探索左边和右边的房间。

以之前的二叉树为例:

1

/ \

2 3

/ \

4 5

        前序遍历的执行过程如下:

        首先访问根节点 1,将 1 添加到结果列表中。

        递归遍历节点 1 的左子树,即节点 2。

  • 访问节点 2,将 2 添加到结果列表中。

  • 递归遍历节点 2 的左子树,即节点 4。

  • 访问节点 4,将 4 添加到结果列表中。

  • 节点 4 的左子树为空,返回。

  • 递归遍历节点 4 的右子树,也为空,返回。

  • 递归遍历节点 2 的右子树,即节点 5。

  • 访问节点 5,将 5 添加到

二叉树遍历特性主要包括三种遍历方式:先序遍历、中序遍历和后序遍历。先序遍历是指先访问根节点,然后按照先序遍历的顺序依次访问左子树和右子树。中序遍历是指先访问左子树,然后访问根节点,最后访问右子树。后序遍历是指先访问左子树,然后访问右子树,最后访问根节点。这三种遍历方式都是通过递归或者使用辅助数据结构(如栈或队列)来实现的。其中,递归是一种较为简洁的实现方式,但由于递归的栈帧消耗较大,所以使用非递归的方式来遍历二叉树也是非常有必要的。非递归遍历二叉树可以借助队列的先进先出的特性来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [数据结构7:基本的二叉树遍历及题目](https://blog.youkuaiyun.com/m0_53607711/article/details/128331361)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [数据结构实验 二叉树遍历方法](https://download.youkuaiyun.com/download/yuan7376313/3174711)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雨淅淅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值