数据结构(选学)

官方信息技术老师·12 页·深入(追求细节与边界)·0 次浏览·3 天前
数组链表树与图底层原理复杂度分析

数据结构(选学)

看穿数组、链表、树、图的底层逻辑与权衡取舍

按 空格/→ 演示下一步

1 / 12 页

全部页面点击任意一页,跳回舞台从这页播放

数组链表树与图底层原理复杂度分析

数据结构(选学)

看穿数组、链表、树、图的底层逻辑与权衡取舍

1第 1 页 · 数据结构(选学)

数据结构的基本概念

你去图书馆找《数据结构》——管理员按分类上架、按编号定位,10 秒就能取出。这就是"把数据组织起来"的价值,也是数据结构要解决的核心问题。

数据结构定义
数据 + 结构 + 操作构成的统一体,研究如何高效组织与处理数据
逻辑结构
集合 / 线性 / 树 / 图四种基本关系,与物理存储方式无关
存储结构
顺序存储与链式存储两大类,决定数据在内存中的实际存取方式
抽象数据类型
把数据与操作封装成模块,仅对外暴露接口,隐藏实现细节
图书馆管理图书对应 →数据结构三要素

分类方式 = 逻辑结构,编号方式 = 存储结构,借阅流程 = 操作

ADT=(D,S,O)\text{ADT} = (D, S, O)
2第 2 页 · 数据结构的基本概念

单链表

数组像一排编号座位,3 排 7 座一查就知道;要在中间插一排,后面的全得挪。火车呢——想加一节车厢,挂钩上就行,不用动别的。这「一节扣一节、每节只记得下一节」就是单链表的核心思路。

节点:data + next
每个节点存数据 data,并存一个指向下一节点的指针 next
由 head 指针串联
链表从 head 开始,每个节点的 next 串下去,末节点的 next 为 null
插入/删除是 O(1)
改一根指针就完成,不需要整体搬动;代价是要先找到那个位置
访问是 O(n)
没有下标,必须从 head 一路 next 走到底,找第 k 个要走 k 步
与数组的取舍
频繁增删选链表,频繁按下标访问选数组;二者底层内存布局完全不同
一列火车的车厢对应 →单链表节点与指针

每节车厢是节点;车厢里的货物是 data;车钩是 next;要找第 N 节只能从车头一节节走过去

3第 3 页 · 单链表

单链表的插入和删除

当你需要在链表中间插入或删除一个节点时,最直观的反应是『把后面的节点全部挪一下』——但链表的设计者说:完全不需要,只改一两根指针就够了。为什么?

插入三步走
定位前驱 → 新节点 next 接上后续 → 前驱 next 改指向新节点
删除三步走
定位前驱 → 前驱 next 跳过目标 → 释放目标节点内存
复杂度拆解
定位需遍历 O(n),改指针本身只 O(1);已持前驱时插入是 O(1)
边界易踩坑
头节点操作要改 head 本身;空链表、单节点链表需单独判空
排队时有人插队或离队对应 →单链表插入删除

只需重新握手(改 next 指针),队伍里其他人位置不动

4第 4 页 · 单链表的插入和删除

栈和队列

上一节我们用指针串好了单链表,谁先谁后没限制。但实际工程里有两种「规矩特别严」的存取方式出场率最高:一种像叠盘子只能拿最上面,一种像食堂打饭必须排队。今天认认它们。

栈 Stack
后进先出 LIFO,所有操作限制在栈顶一端
队列 Queue
先进先出 FIFO,从队尾入队、队头出队
核心操作 O(1)
压栈/弹栈、入队/出队都是常数时间,与规模无关
典型应用
浏览器后退、函数调用栈、消息缓冲、任务调度都靠它们
食堂打饭排队对应 →队列的 FIFO 规则

先排的人先打饭离开,后来的人只能站到队尾,与队列的进出方式一致

5第 5 页 · 栈和队列

树结构

树结构:定义、要点与典型应用

树结构
树结构:定义、要点与典型应用
6第 6 页 · 树结构

二叉树

上页我们认识了「树」:任意节点可以有任意多个孩子。但加上「每个节点最多 2 个孩子」这条限制后,看似削弱了灵活性,却换来搜索与遍历上的巨大便利——这就是二叉树。

定义与递归
每个节点最多 2 个孩子(左、右),左右子树本身也是二叉树
满二叉树
除叶子外每个节点都有 2 个孩子,且所有叶子都在同一层
完全二叉树
除最后一层外全满,最后一层叶子紧靠左侧连续排列
四种遍历
前/中/后序(递归或栈),层序(队列);BST 中序即升序
典型应用
二叉搜索树、堆、表达式求值、哈夫曼编码等
猜数字游戏对应 →二分搜索树

每次回答「大了/小了」就把候选砍半,N 个数只需 ⌈log₂N⌉ 次

n=2h1n = 2^h - 1
7第 7 页 · 二叉树

遍历二叉树

上一页我们搭好了一棵二叉树,但节点摆在那儿不会自己说话——真正的问题是:怎么按某种确定的顺序,把每个节点都恰好访问一次?这就是遍历。

遍历目标
按确定规则访问每个节点恰好一次,不重不漏
深度优先三种
前/中/后序,区别仅在根节点被访问的时刻(左、右递归顺序固定)
广度优先层序
用队列实现,一层一层从左到右访问
递归与显式栈
递归版依赖调用栈,改写循环需显式维护栈或队列
拜访亲戚网络对应 →三种 DFS 遍历顺序

先序=到了就打招呼;中序=左边亲戚全走完才轮到自己;后序=所有下属都问完好才轮到自己

8第 8 页 · 遍历二叉树

二级C考点解析之数据结构

从单链表到二叉树遍历,核心结构我们都过了一遍。二级C考这一块以选择题为主,三个层次把握住就能稳过:概念辨析、复杂度判断、综合应用。

概念辨析
逻辑结构看关系(线性/树/图),存储结构看内存组织(顺序/链式),同一逻辑可对应多种存储
复杂度判断
大O记最高阶项;二分查找O(log₂n)、顺序查找O(n)、冒泡O(n²);时间空间常需权衡
综合应用
由先+中或中+后遍历序列还原二叉树;栈的合法出栈序列判定;链表操作手工推演
厨神备餐三步对应 →数据结构考点

认识食材对应概念辨析,掌握火候对应复杂度判断,摆盘出品对应综合应用

9第 9 页 · 二级C考点解析之数据结构

二级C考点解析之数据结构

前面我们挨个看了链表、栈、树……现在把它们收拢到二级C的试卷上——看看考什么、怎么考、坑在哪。

链表运算
插入删除要"先接后断",头节点单独处理;时间主要花在找位置上
栈与队列
栈后进先出,队列先进先出;循环队列用公式判满判空
二叉树遍历
前序根左右、中序左根右、后序左右根;已知前序+中序可唯一还原树
时间复杂度
顺序查找 O(n),二分查找 O(log₂n);选择题常考,要会对比优劣
栈是摞盘子,队列是排队对应 →LIFO 与 FIFO

盘子只能从最上面拿=栈顶;排队先到先服务=队头出队

(rear+1)modMAXSIZE==front(rear+1) \bmod MAXSIZE == front
10第 10 页 · 二级C考点解析之数据结构

本节要点

  • 线性表的操作成本取决于存储与指针关系
  • 栈和队列都是受限线性表,核心差异在访问规则
  • 树体现层次关系,二叉树进一步限制分支数
  • 遍历规定访问次序,不会自动改变树的结构
  • 算法分析须兼顾时间、空间与边界情形
延伸主题:复杂度与空间权衡递归与迭代转换常见结构综合辨析
11第 11 页 · 本节要点

课后思考

先独立思考,再对照参考答案。三道题分别对应回顾、应用、迁移三个层次。

1为什么单链表的删除必须找到待删节点的前驱?双向链表是如何解决这个问题的?

参考答案单链表只有 next 指针,找到目标后无法回退到前驱。双向链表多了 prev 指针,可直接定位前驱完成 O(1) 删除。

2浏览器的「前进/后退」功能,你会选什么数据结构实现?为什么不用单链表?

参考答案两个栈:A 存浏览历史、B 存前进记录。单链表不支持 O(1) 栈顶操作,回退代价也高。

3二叉树仅凭先序、中序、后序中的一种遍历,能唯一还原原树吗?为什么中序地位特殊?

参考答案不能。先序/后序能定根但分不开左右;中序能分左右却定不了根。必须两种搭配。中序是唯一能区分左右子树的线索。

12第 12 页 · 课后思考
数据结构(选学) · 知识图解