数据结构 - 二叉树(先序 中序 后序)

本文介绍了二叉树的基本概念,包括结点的度、叶子结点、树的深度等,并详细阐述了先序、中序和后序遍历的方法。通过示例展示了遍历结果。此外,还提供了相关代码展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.二叉树名词解释

二叉树的定义:

二叉树是一种每个结点至多只有两个子树(即二叉树的每个结点的度不大于2),并且二叉树的子

树有左右之分,其次序不能任意颠倒。

树是使用了递归定义的数据结构,树的子树还是树,其结构如下图所示:

这里写图片描述

  • 度:结点拥有的子树数目,例如上图结点A的度为3,结点E的度为0
  • 叶子或终端结点:度为0的结点(没有子树的结点)
  • 树的度:各个结点中度的最大值
  • 孩子:结点的子树的根,称为根的孩子
  • 层次:根的层次为0,根的孩子为1,以此类推
  • 深度:树中结点的最大层次,称为树的深度

2.遍历二叉树

先序遍历:只经过一次就取值,先根 再左 再右。

先序遍历可以想象为,一个小人从一棵二叉树根节点为起点,沿着二叉树外沿,逆时针走一圈回到

根节点,路上遇到的元素顺序,就是先序遍历的结果。

先序遍历结果为:A B D H I E J C F K G

在这里插入图片描述

 中序遍历:经过两次才取值,先左 再根 再右。

中序遍历可以看成,二叉树每个节点,垂直方向投影下来(可以理解为每个节点从最左边开始垂直

掉到地上),然后从左往右数,得出的结果便是中序遍历的结果。

中遍历结果为:H D I B E J A F K C G

在这里插入图片描述

后序遍历 :经过三次才取值,先左 再右 再根。

后序遍历中,根节点默认最后面

后序遍历结果:H I D J E B K F G C A

在这里插入图片描述

3.代码展示:

### 根据、中后序遍历还原二叉树的结构 在数据结构中,二叉树可以通过不同的遍历方式(、中后序)来还原其结构。每种组合都有特定的方法。 #### 1. + 中 遍历还原二叉树 根据遍历的第一个元素建立根节点,在中遍历中找到该元素,确定根节点的左右子的中列;在列中确定左右子列;由左子列和中列建立左子;由右子列和中列建立右子 [^3]。 例如: - 已知一棵二叉树遍历列为 `abdgcefh`。 -遍历列为 `dgbaechf`。 通过上述步骤可以逐步还原出二叉树的结构。 #### 2. 中 + 后序 遍历还原二叉树 根据后序遍历的最后一个元素建立根节点,在中遍历中找到该元素,确定根节点的左右子的中列;在后序列中确定左右子后序列;由左子的中后序列建立左子;由右子的中后序列建立右子 [^1]。 例如: - 已知一棵二叉树的中遍历列为 `dgbaechf`。 - 后序遍历列为 `gdbefcah`。 通过上述步骤可以逐步还原出二叉树的结构。 #### 3. + 后序 遍历还原二叉树 虽然理论上后序遍历可以唯一确定一棵二叉树的结构,但在实际操作中通常需要额外的信息来辅助,因为单独使用后序遍历无法直接确定根节点的左右子边界。因此,通常会结合其他方法或假设来完成还原过程 [^2]。 ### 示例代码:根据中后序遍历重建二叉树 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def build_tree(inorder, postorder): if not inorder or not postorder: return None root_val = postorder.pop() root = TreeNode(root_val) inorder_index = inorder.index(root_val) root.right = build_tree(inorder[inorder_index+1:], postorder) # 注意这里构建右子 root.left = build_tree(inorder[:inorder_index], postorder) return root # 示例用法 inorder = ['d', 'g', 'b', 'a', 'e', 'c', 'h', 'f'] postorder = ['g', 'd', 'b', 'e', 'f', 'c', 'a', 'h'] root = build_tree(inorder, postorder) ``` ### 相关问题 1. 如何根据中后序遍历结果求二叉树的深度? 2. 在已知和中遍历的情况下,如何验证重建的二叉树是否正确? 3. 如果只知道后序遍历结果,能否唯一确定一棵二叉树?为什么? 4. 如何根据重建的二叉树进行层遍历? 5. 在Python中,如何可视化重建后的二叉树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式_笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值