二叉树知识点、先序、中序、后序遍历(数据结构)

本文介绍了二叉树的基本概念,包括满二叉树、完全二叉树及其特点,以及二叉树的深度、孩子、兄弟和双亲等术语。此外,详细解释了二叉树的前序、中序和后序遍历方法。

Reference:
1. 作者:小马
2. 作者:ggmghwp

一 、二叉树的概念

二叉树就是每个结点最多有两个子树的树形存储结构。
这里写图片描述

 1、满二叉树和完全二叉树

上图就是典型的二叉树,其中左边的图还叫做满二叉树,右边是完全二叉树。然后我们可以得出结论,满二叉树一定是完全二叉树,但是反过来就不一定。满二叉树的定义是除了叶子结点,其它结点左右孩子都有,深度为k的满二叉树,结点数就是2的k次方减1。完全二叉树是每个结点都与深度为k的满二叉树中编号从1到n一一对应。

2、树的深度
树的最大层次就是深度,比如上图,深度是4。很容易得出,深度为k的树,拥有的最大结点数是2的k次方减1。

3、树的孩子,兄弟,双亲
上图中,B,C是A的孩子,B,C之间互为兄弟,A是B,C的双亲。

二、二叉树的先序、中序、后序遍历

1.前序遍历(DLR)

所谓前序遍历是指在访问根结点、遍历左子树与遍历右子树这三者中,首先访问根结点,然后遍历左子树,最后遍历右子树;并且,在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。因此,前序遍历二叉树的过程是一个递归的过程。
下面是二叉树前序遍历的简单描述:
若二叉树为空,则结束返回。
否则:
(1)访问根结点;
(2)前序遍历左子树;
(3)前序遍历右子树。
在此特别要注意的是,在遍历左右子树时仍然采用前序遍历的法。如图所示:这里写图片描述
二叉树进行前序遍历,则遍历的结果为F,C,A,D,B,E,G,H,P(称为该二叉树的前序序列)。

2.中序遍历(LDR)
所谓中序遍历是指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。因此,中序遍历二叉树的过程也是一个递归的过程。
下面是二叉树中序遍历的简单描述:
若二叉树为空,则结束返回。
否则:
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历左子树。
在此也要特别注意的是,在遍历左右子树时仍然采用中序遍历的方法。如图所示:这里写图片描述
二叉树进行中序遍历,则遍历结果为A,C,B,D,F,E,H,G,P(称为该二叉树的中序序列)。

3.后序遍历(LRD)

所谓后序遍历是指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后遍历右子树,最后访问根结点,并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。因此,后序遍历二叉树的过程也是一个递归的过程。
下面是二叉树后序遍历的简单描述:
若二叉树为空,则结束返回。否则:
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根结点。
这里写图片描述
二叉树进行后序遍历,则遍历结果为A,B,D,C,H,P,G,E,F。

### 关于二叉树、中后序遍历 #### 定义与基本概念 在数据结构中,二叉树是一种重要的非线性结构。对于二叉树遍历方式主要有三种:遍历、中遍历以及后序遍历[^1]。 - **遍历**是指按照访问根节点 -> 左子树 -> 右子树的方式进行遍历。 - **中遍历**则是指按照访问左子树 -> 根节点 -> 右子树的方式进行遍历。 - **后序遍历**指的是按照访问左子树 -> 右子树 -> 根节点的方式进行遍历。 这些遍历可以采用递归或者非递归的方式来实现[^1]。 #### 实现方法 以下是基于Python语言分别展示这三种遍历方式的递归实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def preorder_traversal(root): """遍历""" if root is None: return [] return [root.val] + preorder_traversal(root.left) + preorder_traversal(root.right) def inorder_traversal(root): """中遍历""" if root is None: return [] return inorder_traversal(root.left) + [root.val] + inorder_traversal(root.right) def postorder_traversal(root): """后序遍历""" if root is None: return [] return postorder_traversal(root.left) + postorder_traversal(root.right) + [root.val] ``` 以上代码展示了如何通过递归函数来完成二叉树的三种主要遍历操作[^1]。 #### 构建二叉树 除了单纯的遍历外,还可以利用给定的两种遍历序列(如+中 或者 后序+中)唯一地重建一颗二叉树[^2]。然而需要注意的是,并非任意两组遍历都可以用来恢复原始二叉树;例如,仅提供后序遍历时无法保证能够唯一确定一棵二叉树[^2]。 下面是一个简单的例子演示如何依据与中遍历来重新创建二叉树[^3]: ```python def build_tree(preorder, inorder): if not preorder or not inorder: return None root_val = preorder[0] root_index_in_inorder = inorder.index(root_val) root = TreeNode(root_val) root.left = build_tree(preorder[1:1 + root_index_in_inorder], inorder[:root_index_in_inorder]) root.right = build_tree(preorder[root_index_in_inorder + 1:], inorder[root_index_in_inorder + 1:]) return root ``` 此函数接受两个列表参数——`preorder`(遍历结果) 和 `inorder`(遍历结果),并返回新建立起来的二叉树对象实例[^3]。 ### 总结 通过对二叉树的学习不仅可以掌握其基础理论知识还能深入理解各种实际应用场景下的算法设计思路。无论是简单还是复杂的题目都离不开扎实的数据结构功底支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值