数据结构——十四、构造二叉树(王道408)

文章目录

前言

本文介绍了通过不同遍历序列构造二叉树的原理与方法。主要内容包括:1)单一遍历序列(前序/中序/后序/层序)无法唯一确定二叉树结构;2)前序+中序序列构造二叉树的递归思想与实例;3)后序+中序序列构造方法;4)层序+中序序列构造方法。核心要点是必须结合中序序列才能唯一确定二叉树结构,因为中序序列能准确定位根节点位置,从而划分左右子树。通过多个实例演示了如何根据不同的遍历序列组合逐步还原二叉树结构。
代码文件在开头,需要自取🧐

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

1.不同的二叉树的中序/前序/后序遍历序列

1.中序遍历序列

  • 中序遍历:中序遍历左子树、根结点、中序遍历右子树

  • 图一

  • 图二

  • 图三

  • 结论:一个中序遍历序列可能对应多种二叉树形态

2.前序遍历序列

  • 前序遍历:根结点、前序遍历左子树、前序遍历右子树

  • 图一

  • 图二

  • 图三

  • 结论:一个前序遍历序列可能对应多种二叉树形态

同样的:一个后序遍历序列或者层序遍历序列也可能对应多种二叉树形态,这里就不举例了

3.结论

  • 若只给出一棵二叉树的前/中/后/层序遍历序列中的一种,不能唯一确定一棵二叉树

2.前序+中序遍历序列构造二叉树

1.基本思想

  • 前序序列当中最先出现的那个结点一定是根节点,通过这个信息确定中序序列中根结点的位置
  • 在中序序列中根节点左边出现的这些结点肯定就是左子树中的结点,右边的肯定是右子树的结点
  • 根据这个思想可以递归的恢复二叉树

2.实例

  • 中序遍历序列:B D C A E
  • 前序遍历序列:A D B C E
  1. 根据前序序列的第一个字符一定是根节点的结论,在前序序列中确定A是根节点

  2. 在中序序列中找到根节点A,根节点A的左边是左子树中序序列,右边是右子树中序序列

  3. 现在看A的右子树中序序列是BDC,在前序序列中找到DBC

  4. 根据前序序列的第一个字符一定是根节点的结论,D是A右子树的根节点

  5. 再回到中序序列,确认D是根节点后,即可知道B是以D为根节点的树的左子树,C是右子树

  6. 再看以A为根结点的左子树E,因为只有一个E,所以构造完成

3.后序+中序遍历序列构造二叉树

1.基本思想

  • 后序序列当中最后出现的那个结点一定是根节点,通过这个信息确定中序序列中根结点的位置
  • 在中序序列中根节点左边出现的这些结点肯定就是左子树中的结点,右边的肯定是右子树的结点
  • 根据这个思想可以递归的恢复二叉树

2.实例

  • 后序遍历序列:EFAHCIGBD
  • 中序遍历序列:EAFDHCBGI
  1. 根据后序序列的最后个字符一定是根节点的结论,确定D是根节点

  2. 在中序序列中找到根节点D,根节点D的左边是左子树中序序列,右边是右子树中序序列

  3. 先看以D为根节点的左子树,根据后序序列的最后个字符一定是根节点的结论,得出A一定是根节点

  4. 查看中序序列确定以A为根节点的左子树是E,右子树为F

  5. 再看以D为根节点的右子树,查看后序序列得知B一定是根节点

  6. 查看中序序列确定以B为根节点的左子树是HC,右子树为GI

  7. 先看以B为根结点的左子树,查看后序序列得知C一定是根节点

  8. 查看中序序列确定以C为根节点的左子树是H,右子树为NULL

  9. 再看以B为根节点的右子树,查看后序序列得知G一定是根节点

  10. 查看中序序列确定以G为根节点的左子树是NULL,右子树为I,至此,所有元素已经还原完毕

4.层序+中序遍历序列构造二叉树

1.基本思想

  • 层序序列当中从左往右依次是根结点,第一层根节点的左右子树的根结点,第二层的根节点的左右子树的根结点,...以此类推,通过这个信息确定中序序列中根结点的位置
  • 在中序序列中根节点左边出现的这些结点肯定就是左子树中的结点,右边的肯定是右子树的结点
  • 根据这个思想可以递归的恢复二叉树

2.实例

  • 层序遍历序列:DABEFCGHI
  • 中序遍历序列:EAFDHCBGI
  1. 根据层序序列的特点,D是第一层的根结点

  2. 在中序序列中找到根节点D,根节点D的左边是左子树中序序列EAF,右边是右子树中序序列HCBGI

  3. 同时查看以D为根节点的左子树与右子树,根据层序序列的特点,得出A一定是左子树的根节点,B一定是右子树根节点

  4. 查看中序序列得知以A为根节点的左子树是E,右子树为F;以B为根节点的左子树为HC,右子树为GI

  5. 同时查看以B为根节点的左子树与右子树,根据层序序列的特点,除开已经在以D为根节点的左子树的EF外,得出C一定是左子树的根节点,G一定是右子树根节点

  6. 查看中序序列得知以C为根节点的左子树是H,右子树为NULL;以G为根节点的左子树为NULL,右子树为I,至此,所有元素已经还原完毕

5.小结

  • Key:找到树的根节点,并根据中序序列划分左右子树,再找到左右子树根节点
  • 结论:前序、后序、层序序列的两两组合无法唯一确定一课二叉树,必须至少有一个中序

结语

十一放松结束,又来苦哈哈的学习了😫
想查看其余数据结构的篇章?

请点击一、数据结构专栏导航页(王道408)

相关推荐
今儿敲了吗几秒前
01|多项式输出
c++·笔记·算法
朔北之忘 Clancy11 分钟前
2025 年 9 月青少年软编等考 C 语言一级真题解析
c语言·开发语言·c++·学习·数学·青少年编程·题解
Xの哲學13 分钟前
深入剖析Linux文件系统数据结构实现机制
linux·运维·网络·数据结构·算法
C雨后彩虹37 分钟前
竖直四子棋
java·数据结构·算法·华为·面试
wxr061640 分钟前
GIT学习
git·学习
oraen1 小时前
【AI学习-2.1】部署自己的本地大模型 -本地推理
学习
لا معنى له1 小时前
学习笔记:Restormer: Efficient Transformer for High-Resolution Image Restoration
图像处理·笔记·学习·计算机视觉·transformer
claider1 小时前
Vim User Manual 阅读笔记 Usr_05.txt Set your settings 设置你的设置
笔记·编辑器·vim
荒诞硬汉2 小时前
对象数组.
java·数据结构
科技林总2 小时前
【系统分析师】3.4 指令系统
学习