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

相关推荐
2301_8002561111 分钟前
第七章 空间存储与索引 知识点梳理3(空间填充曲线)
数据库·笔记·sql·postgresql
好奇龙猫21 分钟前
【AI学习-lora-定义-comfyUI相关-相关学习-了解概念(1)】
人工智能·学习
稚辉君.MCA_P8_Java34 分钟前
Gemini永久会员 Java实现的暴力递归版本
java·数据结构·算法
冯诺依曼的锦鲤1 小时前
算法练习:差分
c++·学习·算法
凉凉的知识库2 小时前
书海拾遗:《枪炮、病菌与钢铁》
笔记·电子书
im_AMBER2 小时前
算法笔记 16 二分搜索算法
c++·笔记·学习·算法
摇滚侠2 小时前
2025最新 SpringCloud 教程,Nacos-总结,笔记19
java·笔记·spring cloud
赵文宇(温玉)2 小时前
不翻墙,基于Rancher极速启动Kubernetes,配置SSO登录,在线环境开放学习体验
学习·kubernetes·rancher
在逃热干面2 小时前
(笔记)获取终端输出保存到文件
java·笔记·spring
leoufung2 小时前
逆波兰表达式 LeetCode 题解及相关思路笔记
linux·笔记·leetcode