Linux入门DAY23(C语言树形结构)

#二叉树# #树形结构# #遍历#

前言

在数据结构四大逻辑结构:集合、线性结构、树形结构、图形结构中,线性结构描述一对一关系,树形结构描述一对多的关系,是非常重要的非线性数据结构。前面学习的链表、栈、队列都属于线性结构,而树打破了一对一的约束,一个节点可以拥有多个子节点。

二叉树是树最常用的特例,广泛应用于文件系统、排序搜索、哈夫曼编码等场景。本篇笔记整理树与二叉树基础概念、专有名词、特殊二叉树、遍历算法以及重建二叉树知识点,方便大家复习刷题。

程序设计 = 数据结构 + 算法,树形结构是面试笔试高频考点。

一、树基础概念

树是由根节点和若干子节点构成,元素之间一对多关系的数据集合。

  • 空树:没有任何结点的树。
  • 根节点:树最顶层的节点,没有父节点。
  • 叶子节点(终端节点):度为 0,没有子节点。
  • 分支节点:拥有子节点的节点。

专有名词

  1. 节点的度:一个节点拥有子节点的数量。
  2. 树的度(广度):树中所有节点的度的最大值。
  3. 树的深度:树的总层数。

二、二叉树

二叉树:树的度最大为 2,左右子树不能互换,每个节点最多只能有两个孩子,分为左子树、右子树。

1. 满二叉树

不增加层数情况下,不能新增任何节点,每一层节点数达到最大值。

  • K 层满二叉树:
    • 第 k 层节点数量:\(2^{k-1}\)
    • 整棵树全部节点总数:\(2^k-1\)

2. 完全二叉树

在满二叉树基础上,从上到下、从左往右依次新增节点;或者从满二叉树从下到上、从右往左删除节点得到。

重要结论:满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。堆就是基于完全二叉树实现。

三、二叉树遍历(高频考点)

遍历就是按照某种规则,访问树中每一个节点,分为深度优先遍历 和广度优先(层序)遍历。

深度优先遍历 DFS

表格

遍历方式 访问顺序 口诀
前序遍历 根 → 左子树 → 右子树 根左右
中序遍历 左子树 → 根 → 右子树 左根右
后序遍历 左子树 → 右子树 → 根 左右根

广度优先遍历 BFS

  • 层序遍历:从上往下,同一层从左到右逐个访问节点,一般借助队列实现。

二叉树还原(笔试常考)

  1. ✅ 前序 + 中序遍历序列,可以唯一还原二叉树
  2. ✅ 后序 + 中序遍历序列,可以唯一还原二叉树
  3. ❌ 前序 + 后序,不能唯一还原一棵二叉树,缺少中序无法区分左右子树边界。

原理:前序第一个元素 / 后序最后一个元素是根节点;拿到根节点,在中序序列分割出左子树全部节点、右子树全部节点,递归反复分割即可构建整棵树。

四、小结

  1. 树形结构属于一对多逻辑结构,区别于链表栈队列的一对一线性结构。
  2. 二叉树每个节点最多 2 个子节点,左右子树严格区分,不能交换。
  3. 满二叉树每层节点填满;完全二叉树节点靠左紧密排列。
  4. 三种深度遍历:前序 (根左右)、中序 (左根右)、后序 (左右根);层序遍历使用队列。
  5. 必须要有中序遍历结果,搭配前序或者后序,才能唯一复原二叉树。
相关推荐
zhangrelay25 分钟前
机械臂末端规划智能模型的误区演示
linux·笔记·学习·ubuntu·ros2
水饺编程30 分钟前
第1章,了解乌班图环境,使用浏览器和邮箱
c语言·汇编·ubuntu
Escalating_xu2 小时前
【C 语言】操作符详解(下):逗号、下标、结构体、类型转换与表达式求值
c语言
Ivanqhz2 小时前
正余弦位置编码(Sinusoidal Positional Encoding)
java·linux·数据库
H.莓飛2 小时前
【数据结构】队列
linux·数据结构·centos
小此方3 小时前
Linux网络(十九):TCP流量控制与滑动窗口详解,超时重传和快重传到底有什么区别
linux·运维·服务器·网络·网络协议·tcp/ip
码上有光3 小时前
Linux进程通信——共享内存、消息队列和信号量
android·linux·运维·共享内存·通信
沫璃染墨3 小时前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构
不会就选b3 小时前
算法日常・每日刷题--<动态规划>3
数据结构·算法
Java后端的Ai之路3 小时前
Python进阶探索24_应用案例_linux系统的监控
linux·开发语言·python·应用·探索