第一章 基本概念
数据
- 数据:描述客观事物的符号。包括数据类型或者声音图像等非数据类型
- 数据项: 一个数据元素可以由若干个数据项组成。它是数据不可分割的最小单位
- 数据元素:组成数据的有一定意义的基本单位。又被称为记录
- 数据对象: 性质相同的数据元素的集合
- 数据结构: 是相互之间存在一种或者多种特定关系的数据元素的集合
逻辑
- 逻辑结构: 数据对象中数据元素之间的关系
集合结构: 其中的数据元素除了属于同一个集合,无其他关系
线性结构: 数据元素之间是一对一的关系
树形结构: 数据元素之间存在一对多的关系
图形结构: 多对多
注: 每个数据元素看成节点,圆圈表示;关系用连接线表示,可带箭头
物理结构
- 顺序结构: 顺序放在地址连续的存储单元里
- 链式结构: 任意的存储单元中,或不连续
小结
第二章 算法
特性
- 有穷性:有限步骤
- 确定性:含义唯一
- 可行性:任意步可行
- 输入输出
设计要求
- 正确性
- 可读性
- 健壮性
- 高效低存
第三章 线性表
- 定义: 零个或多个数据元素的有限 序列
n为长度。n=0则为空表
- 例1:A和B并集
链表的顺序存储结构
- 顺序存储:一段连续的地址存放数据元素
缺点:移动、删除挪动元素太多
- 链式存储:解决如上缺点
头指针:链表中第一个节点的存储位置
头节点:单链表的第一个节点前设置。头节点的数据域可以不存储信息,头节点的指针域指向第一个节点的指针
- C语言中的结构指针表示
静态链表
- 数组代替指针,描述单链表
- data描述值,cur相当于next。存放后继元素的下表。这种数组称为静态链表
第四章 栈与队列
- 栈: 仅在表尾进行插入和删除操作的线性表
- 队列: 只允许在一端进行插入操作,一端删除
- 栈的相关结构
数据结构
进栈
出栈
栈:链式存储
第六章 树
- 定义: n个结点的有限集。
有且仅有一个根节点
n>1时,其余结点可分为m个互不相交的有限集。每个集合本身是一棵树,并且称为根的子树
- 注:
n>0时根结点唯一。
m>0是子树数目无限制,但必不相交。
下图不符合树的定义,子树相交了
6.1 相关定义
- 结点分类
度:结点拥有的子树数目。度为0就是叶节点。树的度是各结点度的最大值。
森林:m个互不相交的树的集合。
- 存储结构
双亲表示法,如下图
孩子表示法
孩子兄弟表示法
二叉树
- 特点:
每个结点最多两棵子树
左右子树有序
- 五种形态:
空树
仅有根结点
根结点仅有左子树
根结点仅有右子树
根结点既有左子树也有右子树
- 特殊树形态:
斜树:左斜树或右斜树
满二叉树:所有结点均有左右子树且所有叶子节点均在同一层
完全二叉树:
- 二叉树的特点:
叶子结点只在最下两层
最下层的叶子一定集中在做不连续位置
倒数第二层,若有叶子结点,一定都在右侧连续位置
结点度为1,则必为左孩子
同样节点的二叉树,完全二叉树的深度最小
二叉树的性质
二叉树存储结构
- 顺序存储
- 二叉链表
遍历方式
-
前
-
中
-
后
-
层次
二叉树建立
线索二叉树
树、森林、二叉树
- 树、二叉树
加线
给除长子外的孩子去线
- 森林、二叉树
将每棵树转化成二叉树
将下一颗树的根结点作为上一颗树根结点的右孩子
- 二叉树、树
加线:若某节点的左孩子存在,就将左孩子的右孩子、右孩子的右孩子、右孩子的右孩子的右孩子都作为此节点的孩子。将该结点与这些右孩子结点用线连接起来
去线:删除二叉树中所有结点与其右孩子结点的连线。
调整层次
- 二叉树、森林
从根结点开始,若右孩子存在,就将右孩子结点的连线删除。再查看分离后的二叉树。若右孩子存在,则连线删除。直到所有右孩子连线都删除为止,得到分离的二叉树
再将每颗分离后的二叉树转化为树。
树与森林的遍历
- 树的两种
先序遍历
后序遍历
- 森林
先序遍历
后序遍历
赫夫曼树
-
路径长度:从树中一个结点到另一个节点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度。
-
哈夫曼树构建
-
哈夫曼编码