数据结构——十四、构造二叉树(王道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)

相关推荐
少许极端2 分钟前
算法奇妙屋(九)-栈
java·数据结构·算法·
rengang661 小时前
10-神经网络的工作原理:分析神经网络如何学习和推理
人工智能·深度学习·神经网络·学习
无语子yyds1 小时前
C++双指针算法例题
数据结构·c++·算法
lkbhua莱克瓦242 小时前
Java练习——正则表达式2
java·开发语言·笔记·正则表达式·github·学习方法
立志成为大牛的小牛2 小时前
数据结构——三十六、拓扑排序(王道408)
数据结构·学习·程序人生·考研·算法
degen_2 小时前
DXE流程
c语言·笔记·bios
懒羊羊不懒@2 小时前
JavaSe—List集合系列
java·开发语言·数据结构·人工智能·windows
2301_796512522 小时前
Rust编程学习 - 如何快速构建一个单线程 web server
前端·学习·rust
十五学长2 小时前
程序设计C语言
c语言·开发语言·笔记·学习·考研
10001hours6 小时前
初阶数据结构.1.顺序表.通讯录项目(只有源码和注释)
数据结构·算法