数据结构--二叉树构造与遍历顺序的相互转化

1.二叉树遍历方式

1.1 先序遍历

  1. 访问根节点
  2. 先序遍历左子树
  3. 先序遍历右子树

图中遍历顺序为A,B,C

  1. 按照先序遍历思想,先访问根结点,再访问左子树,最后访问右子树,即根左右的顺序。
  2. 该二叉树的根结点为 A 结点,则 A 结点先被访问,继续访问 A 结点的左子树。
  3. A 结点左子树依然先访问根结点 B,然后继续递归访问 B 结点的左子树,访问 B 结点的左子树根结点 D,继续访问 D 结点的左子树,左子树为空,继续访问 D 结点右子树,访问完其根结点 E 后继续访问 E 的左子树,左子树根结点为 H 结点。至此,以 A 结点为根的左子树全部访问完毕。
  4. 继续访问该二叉树右子树。首先访问根结点 C,继续访问其左子树根结点 F,至此,A 子树结点访问完毕,继续访问右子树根结点 G。
  5. 可得二叉树的先(前)序遍历序列为 A、B、D、E、H、C、F、G。

1.2 中序遍历

  1. 中序遍历左子树
  2. 访问根节点
  3. 中序遍历右子树

图中遍历顺序为B,A,C

  1. 按照中序遍历思想,先访问左子树,再访问根、结点,最后访问右子树,即左根右的顺序。
  2. 从根结点向左下方寻找,直到某一结点没有左子树为止。
  3. 因 D 结点左子树为空,则访问它自身,而后继续访问 D 结点的右子树。
  4. 其右子树中也是顺着左下方寻找,发现 H 结点不再有左子树,故 D 结点的左子树中先访问 H 结点,继续访问 H 所在子树的根结点,即 B 结点。B 结点右孩子为空,至此,以 A 结点为根的左子树全部访问完毕。
  5. 继续访问根结点 A,再访问其右子树。右子树中还是向左下方寻找,F 结点没有左孩子,则先访问它,再访问 F 所在子树的根结点 C,后访问 C 的右孩子。
  6. C 右孩子的左子树为空,再先访问右孩子的根结点 G,G 结点的右孩子为空,则该树访问完毕。
  7. 故可得二叉树的中序遍历序列为 D、H、E、B、A、F、C、G。

1.3 后序遍历

  1. 后序遍历左子树
  2. 后序遍历右子树
  3. 访问根节点

图中遍历顺序为B,C,A

  1. 按照后序遍历思想,先访问左子树,再访问右子树,最后访问根结点,即左右根的顺序。
  2. 从根结点向左下方寻找,直到某一结点没有左子树为止。
  3. 因 D 结点左子树为空,再访问其右子树,右子树中依旧先访问其左子树;结点 H 不再有左子树,故先访问它,再访问以 E 结点为根的右子树,B 结点的右子树为空,则访问它本身。后访问 E 结点的根结点 D,再访问 D 的根结点 B 结点。
  4. 至此,A 结点的左子树访问完毕。继续访问 A 结点的右子树。沿着右子树的左下方访问,C 结点的左孩子 F 结点没有左孩子,则访问它。后访问 C 结点的右子树。
  5. G 结点左右孩子为空,则访问 G 结点。至此,C 结点的左右子树均访问完毕,继续访问 C 结点。A 的右子树也访问完毕,最后访问根结点 A。
  6. 故可得二叉树的后序遍历序列为H、E、D、B、F、G、C、A。

2.例题练习

3.由遍历序列构造二叉树

先序确定根(开头元素),中序分左右

后序确定根(末尾元素),中序分左右

3.1 先序与中序序列

已知一棵二叉树的先根序列为EBADCFHGIKJ ,中根序列为 ABCDEFGHIJK试画出这棵二叉树。

  • 在先根序列中找到头元素E,在中根序列中以E为中心分割
  • 在先根序列中对应找到 BADC,B在首位,则B为左子树的头元素
  • 回归到中根序列,元素B将ABCD分割成A与CD两部分,对应左右子树
  • 单独对右子树CD进行分析,在先根序列中对应找到 DC,D为头元素
  • 回归到回归到中根序列,元素D左侧为C,右侧为空
  • 同理,运用以上方法对右子树进行分析,在先根序列中确定头元素,在中根序列中区分左右子树,依次循环往复

最终得到完整的二叉树,如图所示

3.2 后序与中序序列

已知一棵二叉树的后根遍历序列为 EICBGAHDF ,同时知道该二叉树的中根遍历序列为CEIFGBADH,试画出该二叉树

后根遍历序列中,头元素位于末端

  • 根据后根序列,找到头元素F,在中根序列中分割成CEI与GBADH两部分
  • 单独定位CEI进行分析,由后根序列可知C为头元素
  • 回归到中根序列,C左子树为空,右子树为EI
  • 单独定位EI,由后根序列可知I为头元素
  • 回归到中根序列,I左子树为E,右子树为空
  • 同理,运用以上方法对右子树进行分析,在后根序列中确定头元素,在中根序列中区分左右子树,依次循环往复,最终二叉树如图所示

4.线索二叉树

4.1 概念定义

在普通二叉树中,存在大量空指针 (叶子节点的左右指针为空,非叶子节点的某侧子树为空时也会有空指针)。线索二叉树通过利用这些空指针存储遍历序列的前驱或后继节点信息,将二叉树 "线索化",从而实现高效的遍历(无需递归或栈,直接通过线索找到前驱 / 后继)。

二叉树的遍历实现了对一个非线性结构进行线性化的操作,从而使每个结点在线性序列中有且仅有一个直接前驱和直接后继。

4.2 线索二叉树画法

先写出中序遍历序列,根据前驱与后继画图

相关推荐
未若君雅裁1 小时前
斐波那契数列 - 动态规划实现 详解笔记
java·数据结构·笔记·算法·动态规划·代理模式
晨非辰4 小时前
数据结构排序系列指南:从O(n²)到O(n),计数排序如何实现线性时间复杂度
运维·数据结构·c++·人工智能·后端·深度学习·排序算法
星期天29 小时前
3.0 C语⾔内存函数:memcpy memmove memset memcmp 数据在内存中的存储:整数在内存中的存储 ⼤⼩端字节序和字节序判断
c语言·数据结构·进阶·内存函数·数据内存存储
fashion 道格12 小时前
用 C 语言玩转归并排序:递归实现的深度解析
数据结构·算法·排序算法
j_xxx404_13 小时前
C++:继承(概念及定义|作用域|基类与派生类转换|默认成员函数|与友元、静态成员关系|多继承|组合)
数据结构·c++
码银13 小时前
【数据结构】 栈和队列
数据结构
Freedom_my14 小时前
插入排序算法
数据结构·算法·排序算法
9523614 小时前
排序-算法
数据结构·算法·排序算法
WongKyunban14 小时前
插入排序的原理和示例
数据结构·算法·排序算法