[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的过程:

相关推荐
Frank_refuel12 分钟前
【C++】手撕JRpc框架(梳理RPC流程)
c++
wuminyu21 分钟前
JVM虚拟线程的底层实现原理分析
java·linux·c语言·jvm·c++
keyipatience22 分钟前
跳表详细解析
开发语言·数据结构·c++·算法·跳表
喆星时瑜23 分钟前
R语言基础语法入门
开发语言·r语言
汉克老师27 分钟前
GESP2026年9月认证C++一级( 第一部分选择题(8~15题)精讲
c++·gesp·小学生·学c++编程
想吃火锅100539 分钟前
【leetcode】189.轮转数组js
开发语言·javascript·leetcode
郝学胜-神的一滴40 分钟前
AI 编程智能体 02:AI智能体到底是什么
开发语言·人工智能·python·程序人生·pycharm
念何架构之路40 分钟前
go-grpc服务端调用
开发语言·后端·golang
小小、码农43 分钟前
〖Linux文件系统〗:彻底打通文件 IO 全链路
linux·开发语言·数据结构·c++·系统
弹简特1 小时前
【Java项目-企悦抽】13-奖品管理模块-奖品列表和创建奖品的实现
java·开发语言·网络·springboot