当前位置: 首页 > 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.sczhlp.com/news/120334/

相关文章:

  • 图解3:幂等使用场景
  • 做的网站老是掉线营销网站制作设计
  • 推荐一款数据库安全产品:全知科技知形-数据库风险监测系统的价值解析
  • 变量,常量,作用域
  • 番禺做网站企业网站照片要求
  • 四川微信网站建设公织梦网站怎么做
  • wireshark 进行snmp 协议加密报文解密查看
  • 吉林省住房和城乡建设厅网站官网中国互联网协会发起者包括
  • 爬取漫画数据做网站wordpress python采集
  • 国际贸易网站开发什么是网络营销战略?网络营销战略的内容有哪些?
  • 在线制作网站的工具做设计去哪个网站找素材
  • 网上营销网站网站建立的连接不安全
  • 建设网站的合约做a货包好的网站
  • 网页制作 培训wordpress插件dx seo
  • 企业进行网站建设的方式wordpress干什么用的
  • 简单三栏网站网站访客qq获取
  • 成都保障房中心官方网站义乌做网站公司哪家好
  • 泰安市建设信息网站网站视觉设计规范
  • linux kernel synchronization 2
  • MySQL高阶查询语句与视图实战指南 - 指南
  • 订单未支付多种方案
  • 四川信德建设有限公司网站企业邮箱一般用什么
  • 招聘模板制作app百度seo快速排名
  • 制作个人网站教程虚拟主机云主机
  • 如何提高网站的曝光率网站最佳颜色搭配
  • 灯塔网站制作公司兴义市城乡建设局网站
  • 肇庆做网站设计公司google seo wordpress
  • 网站建设基础流程如和做视频解析网站
  • 电子商务网站的建设收益搜索关键词优化
  • 做网站导航用什么开元程序电子商务网站建设考试