[c++]csp-j初赛——树

宇宙免责申明:

  1. 本文由deepseek做过更改,以及进行了语言上的优化,可能会出现错误,如有错误,请私信联系.
  2. 本文的所有图均为本人手画,由于画图时神志不清,如果发现图中有错误,请私信联系.

一、树的基本概念

树是一种非线性数据结构,用于描述数据元素之间的层次关系。它由n(n≥0)个节点组成一个具有层次关系的集合

二、 核心术语一览表

术语 含义 初赛常考指数
根节点 没有父节点的节点,每棵树有且仅有一个 ⭐⭐⭐
叶子节点 度为0的节点(没有子节点) ⭐⭐⭐
父节点/子节点 直接相连的上下层节点 ⭐⭐⭐
节点的度 一个节点含有的子节点个数 ⭐⭐⭐⭐
树的度 树中所有节点度的最大值 ⭐⭐⭐
节点的层次 根为第1层,根的子节点为第2层...... ⭐⭐⭐
树的深度/高度 树中节点的最大层次 ⭐⭐⭐⭐
祖先 从根到该节点路径上的所有节点 ⭐⭐
森林 多棵互不相交的树的集合 ⭐⭐

二叉树

定义:二叉树(Binary Tree) 是每个节点最多只有两个子节点的树,分别称为左子节点和右子节点,次序不能颠倒。

如图:

二叉树概念辨析:

总览:

类型 定义 初赛考点
满二叉树 除叶子节点外,每个节点都有2个子节点;所有叶子节点都在同一层 深度为 h 的满二叉树共有 2ʰ − 1 个节点
完全二叉树 只有最后一层不满,且最后一层的节点全部集中在左侧连续位置 满二叉树是完全二叉树的特殊情况;常考数组下标计算(左孩子 2i,右孩子 2i+1)

「注」重点区分:完全二叉树 ≠ 满二叉树。满二叉树是"完美塞满",完全二叉树是"最后一层从左到右连续排列"。

如图:

二叉树层数计算:

在 CSP-J 初赛中,默认根节点位于第 1 层。设二叉树的高度为 hhh,总结点数为 NNN。

  1. 第 iii 层的最大节点数

    二叉树的第 iii 层最多能容纳的节点数为 2 i−12^{\,i-1}2i−1。(每个节点最多向下延伸出 2 个子节点,节点数呈等比数列:1,2,4,...1, 2, 4, \dots1,2,4,...)

  2. 满二叉树的高度推导

    若该树为满二叉树,则前 hhh 层的所有节点均已填满。总节点数 NNN 等于前 hhh 层的最大节点数之和:

    N=1+2+4+⋯+2h−1 N = 1 + 2 + 4 + \dots + 2^{h-1} N=1+2+4+⋯+2h−1

    根据等比数列求和公式(首项 a1=1a_1=1a1=1,公比 q=2q=2q=2,项数 hhh):

    N=1⋅(2h−1)2−1=2h−1 N = \frac{1 \cdot (2^h - 1)}{2 - 1} = 2^h - 1 N=2−11⋅(2h−1)=2h−1

    由此反推满二叉树的高度:

    2h=N+1  ⟹  h=log⁡2(N+1) 2^h = N + 1 \implies h = \log_2(N + 1) 2h=N+1⟹h=log2(N+1)

  3. 完全二叉树的高度推导

    完全二叉树的前 h−1h-1h−1 层必然是满二叉树,其节点数为 2h−1−12^{h-1} - 12h−1−1。

    由于 hhh 为正整数,该不等式组等价于常用的向下取整公式:

    h=⌊log⁡2N⌋+1 h = \lfloor \log_2 N \rfloor + 1 h=⌊log2N⌋+1

  4. 普通二叉树的高度范围推导

    当每层都尽可能填满节点时,高度达到理论最小值。此时最小的整数 hhh 必须满足 N≤2h−1N \le 2^{h} - 1N≤2h−1,解得:

    hmin⁡=⌈log⁡2(N+1)⌉ h_{\min} = \lceil \log_2 (N + 1) \rceil hmin=⌈log2(N+1)⌉

    当每层都仅有 1 个节点(退化为单链表)时,高度达到理论最大值:

    hmax⁡=N h_{\max} = N hmax=N

二叉树的遍历

二叉树有4种遍历的方式:

遍历方式 顺序 口诀 初赛常考指数 核心应用场景
先序遍历(前序) 根 → 左子树 → 右子树 根左右 ⭐⭐⭐⭐⭐ 表达式树的前缀表达式(波兰式)
中序遍历 左子树 → 根 → 右子树 左根右 ⭐⭐⭐⭐⭐ 表达式树的中缀表达式;二叉搜索树(BST)的中序遍历结果为升序序列
后序遍历 左子树 → 右子树 → 根 左右根 ⭐⭐⭐⭐⭐ 表达式树的后缀表达式(逆波兰式);删除树节点(先删子节点再删自身)
层次遍历 从上到下、从左到右逐层访问 BFS(广度优先) ⭐⭐⭐ 求树的高度/宽度;判断是否为完全二叉树

图示如下:

设有一个二叉树如下:

先序遍历(前序):口诀:根左右

中序遍历:口诀:左根右

后序遍历:口诀:左右根

最后,我们还有一种层序遍历的遍历方法,主旨在于模拟BFS的过程:

相关推荐
今天AI了吗1 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
TELL5211 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
动词ing2 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习2 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
动词ing3 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
caimouse3 小时前
ReactOS 窗口系统分析(7):分层窗口与绘制辅助 — layered.c + draw.c
c语言·开发语言
丰锋ff4 小时前
基于 Qt 的智慧社区物业管理系统
开发语言·qt
夜不会漫长4 小时前
C++入门(1)
开发语言·c++·算法
大鹏说大话4 小时前
从爬虫到决策引擎:大数据下自媒体如何用Python挖掘用户痛点
开发语言·爬虫·python
Niuguangshuo4 小时前
silero-vad:超轻量级开源 VAD 实践指南
开发语言·python