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

相关推荐
故事和你9112 分钟前
洛谷-数据结构-1-3-集合3
数据结构·c++·算法·leetcode·贪心算法·动态规划·图论
xuhaoyu_cpp_java22 分钟前
事务学习(一)
数据库·经验分享·笔记·学习·mysql
自我意识的多元宇宙33 分钟前
二叉树的遍历和线索二叉树--线索二叉树
数据结构
代码地平线42 分钟前
OpenCode零基础教程完整版
笔记
nashane43 分钟前
HarmonyOS 6学习:音频焦点管理实战——解决应用打开中断听书功能的技术指南
学习·音视频·harmonyos·harmonyos 5
大彼方..1 小时前
深入学习cpp初阶模板
开发语言·c++·学习
Wentao Sun1 小时前
又到一年变革时
程序人生
菜鸟丁小真1 小时前
LeetCode hot100-287.寻找重复数和994.腐烂的橘子
数据结构·算法·leetcode·知识点总结
.Cnn1 小时前
Ajax与Vue 生命周期核心笔记
前端·javascript·vue.js·笔记·ajax
笨鸟先飞的橘猫1 小时前
数据结构学习——跳表
数据结构·python·学习