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

相关推荐
Mr.Jessy3 分钟前
JavaScript高级:构造函数与原型
开发语言·前端·javascript·学习·ecmascript
玄斎4 小时前
MySQL 单表操作通关指南:建库 / 建表 / 插入 / 增删改查
运维·服务器·数据库·学习·程序人生·mysql·oracle
晨晖24 小时前
单链表逆转,c语言
c语言·数据结构·算法
清风一徐5 小时前
禅道从18.3升级到21.7.6版本
笔记
Jack___Xue5 小时前
LangChain实战快速入门笔记(六)--LangChain使用之Agent
笔记·langchain·unix
零度@5 小时前
SQL 调优全解:从 20 秒到 200 ms 的 6 步实战笔记(附脚本)
数据库·笔记·sql
CeshirenTester6 小时前
Playwright元素定位详解:8种定位策略实战指南
人工智能·功能测试·程序人生·单元测试·自动化
im_AMBER6 小时前
Leetcode 78 识别数组中的最大异常值 | 镜像对之间最小绝对距离
笔记·学习·算法·leetcode
其美杰布-富贵-李7 小时前
HDF5文件学习笔记
数据结构·笔记·学习
d111111111d8 小时前
在STM32函数指针是什么,怎么使用还有典型应用场景。
笔记·stm32·单片机·嵌入式硬件·学习·算法