当前位置: 首页 > news >正文

Part03 数据结构 - 教程

Part03 数据结构 - 教程

CSP-J 初赛常考知识点总结 - 数据结构篇

1. 图论基础

基本概念与术语

  • 边 (Edge):节点之间的连接线
  • 完全图:任意两个顶点之间都有边相连的图
    • mmm 个节点的完全图边数为:Cm2=m(m−1)2C_m^2 = \frac{m(m-1)}{2}Cm2=2m(m1)
  • 简单路径:顶点序列中顶点不重复出现的路径
  • 连通图:图中任意两个顶点都是连通的(存在路径相连)
    • 注意:完全图一定是连通图,但连通图不一定是完全图

图的分类

  • 有向图:边具有方向性(e=u→ve = u \rightarrow ve=uv
  • 无向图:边没有方向性(e=u−ve = u-ve=uv

环与度

  • :起点和终点相同的路径,且路径中除起点外无重复顶点
    • 自环:起点和终点相同的边(e=(u,u)e = (u,u)e=(u,u)
  • 入度:以顶点 vvv 为终点的边的数量
  • 出度:以顶点 vvv 为起点的边的数量

2. 树结构

基本概念

树的术语

  • 根结点:树的最顶层节点,每棵树有且仅有一个
  • 深度:节点到根结点的路径上的边数
  • 高度:所有节点深度的最大值
  • 叶结点:没有子结点的结点
  • 父结点:除根结点外,每个结点到根路径上的第二个结点
  • 祖先:结点到根路径上除自身外的所有结点
  • 子结点:如果 uuuvvv 的父亲,那么 vvvuuu 的子结点
  • 兄弟:同一父亲的多个子结点互为兄弟
  • 子树:删除与父结点相连的边后,该结点所在的子图
## 3. 二叉树

遍历方式

  • 前序遍历:根 → 左子树 → 右子树
  • 中序遍历:左子树 → 根 → 右子树
  • 后序遍历:左子树 → 右子树 → 根

遍历性质

### 特殊二叉树
满二叉树/完美二叉树
  • 所有叶结点深度相同
  • 深度为 hhh 的满二叉树节点总数为:2h−12^h - 12h1
  • 叶结点数 m0m_0m0 与度为2的结点数 m2m_2m2 满足:m0=m2+1m_0 = m_2 + 1m0=m2+1
  • 高度为:⌊log⁡n⌋+1\lfloor \log n \rfloor + 1logn+1
完全二叉树
  • 只有最下面两层结点的度数可小于2
  • 最下面一层的结点都集中在该层最左边
#### 编号性质

对于满二叉树/完美二叉树/完全二叉树:

  • 结点 iii 的左儿子编号为:2i2i2i
  • 结点 iii 的右儿子编号为:2i+12i + 12i+1
  • 结点 iii 的父结点编号为:⌊i/2⌋\lfloor i/2 \rfloori/2

4. 栈 (Stack)

定义与特性

基本操作

操作功能描述时间复杂度
push(x)元素 xxx 入栈O(1)O(1)O(1)
pop()弹出栈顶元素O(1)O(1)O(1)
top()返回栈顶元素值O(1)O(1)O(1)
empty()判断栈是否为空O(1)O(1)O(1)
size()返回栈中元素个数O(1)O(1)O(1)

5. 队列 (Queue)

定义与特性

基本操作

操作功能描述时间复杂度
push(x)元素 xxx 入队O(1)O(1)O(1)
pop()队首元素出队O(1)O(1)O(1)
front()返回队首元素值O(1)O(1)O(1)
empty()判断队列是否为空O(1)O(1)O(1)
size()返回队列元素个数O(1)O(1)O(1)

6. 链表 (Linked List)

特点与性质

6.1 STL List 的使用

STL中的list是双向链表容器,基本操作如下:

// 初始化
list<
int> myList;
// 添加元素
myList.push_back(1);
// 在末尾添加
myList.push_front(2);
// 在开头添加
// 删除元素
myList.pop_back();
// 删除末尾元素
myList.pop_front();
// 删除开头元素
// 插入元素
auto it = myList.begin();
advance(it, 1);
// 移动迭代器
myList.insert(it, 3);
// 在指定位置插入
// 删除指定元素
myList.remove(2);
// 删除所有值为2的元素
// 遍历
for (auto it = myList.begin(); it != myList.end();
++it) {
cout <<
*it <<
" ";
}
// 或使用范围for循环
for (int val : myList) {
cout << val <<
" ";
}
// 其他操作
myList.size();
// 返回元素个数
myList.empty();
// 判断是否为空
myList.clear();
// 清空链表

7. 字符串 (String)

基本概念

表达式表示法

前缀表达式(波兰式)
中缀表达式
  • 运算符在操作数中间
  • 例:1+2−31 + 2 - 31+23
后缀表达式(逆波兰式)
  • 操作数在前,运算符在后
  • 例:12+3−1 2 + 3 -12+3 对应中缀:1+2−31 + 2 - 31+23
  • 求值方法:使用栈模拟运算

逆波兰式运算的栈模拟代码

// 假设输入为vector<string>& tokens,包含数字和运算符stack<int> st;for (string token : tokens) {if (token == "+" || token == "-" || token == "*" || token == "/") {int b = st.top(); st.pop();int a = st.top(); st.pop();if (token == "+") st.push(a + b);else if (token == "-") st.push(a - b);else if (token == "*") st.push(a * b);else if (token == "/") st.push(a / b);} else {st.push(stoi(token));// 将字符串转换为整数}}int result = st.top();// 最终结果

表达式转换方法

方法一:表达式树
  1. 构建表达式树(叶节点为操作数,内部节点为运算符)
  2. 前序遍历得前缀表达式
  3. 中序遍历得中缀表达式
  4. 后序遍历得后缀表达式
方法二:加括号法(推荐)
  1. 为中缀表达式加括号:1−2+3→((1−2)+3)1-2+3 \rightarrow ((1-2)+3)12+3((12)+3)
  2. 将运算符移到括号前/后
    • 前缀:移到括号前 → +(−(1,2),3)+(-(1,2),3)+((1,2),3)
    • 后缀:移到括号后 → ((1,2)−,3)+((1,2)-,3)+((1,2),3)+
  3. 删除括号得最终表达式

习题参考

  • CSP 2019 入门组第一轮-T6:链表应用
  • CSP 2019 入门组第一轮-T8:二叉树性质

CSP-J 入门组复习大纲

http://www.gsyq.cn/news/8749.html

相关文章:

  • 变量,常量,作用域
  • linux kernel synchronization 2
  • MySQL高阶查询语句与视图实战指南 - 指南
  • 订单未支付多种方案
  • Twincat 中如何将位变量链接到字节
  • 实用指南:【2025最新版】PCL点云处理算法汇总(C++长期更新版)
  • Gemini Proxy for Xcode 26
  • 网络分析模型五
  • Android常用ADB命令
  • 【2025PolarCTF秋季个人赛】WEB方向部分wp
  • 电池热失控(Thermal Runaway of the Battery) - 详解
  • 人工智能大模型 基础知识汇总
  • JavaDay8
  • how to count
  • Ubuntu系统使用gcc和Makefile编译C程序
  • 构造选记
  • 碎碎念(十七)
  • 在 macOS 上准备 CentOS 7.5 离线迁移文件的完整指南
  • 配置Spring框架以连接SQL Server数据库
  • 这一辈子大多数日子是无聊的
  • Elasticsearch面试精讲 Day 11:索引模板与动态映射 - 指南
  • Go 实现验证码识别
  • 跳出 AI 编程的「兔子洞」,4 个实战策略帮你解决90%的死循环
  • 暗黑破坏神4 任务-坚守传统-向古老的雕像展示你坚守的传统
  • C++编程软件 Dev-C++ 安装及使用流程
  • DLL植入漏洞分类与微软安全响应指南
  • 市场交易反心理特征之二:忽视热点切换的苗头
  • 贪心算法应用:投资组合再平衡问题详解 - 实践
  • MCP:Trae中集成Playwright 实现网页自动化测试
  • C语言中的字符、字符串及内存操作函数详细讲解