软件设计师考点七之数据结构与算法
- 数组与矩阵(❤❤)
- 稀疏矩阵
- 线性表(❤❤❤❤❤)
- 广义表(❤❤)
- 树与二叉树(❤❤❤❤❤)
- 相关术语
- 二叉树重要特性
- 二叉树遍历
- 反向构造二叉树
- 树转二叉树
- 查找二叉树
- 平衡二叉树
- 图(❤❤)
- 基本概念
- 邻接矩阵
- 图的存储
- 图的遍历
- 拓扑排序
- 图的最小生成树
- 排序与查找(❤❤❤❤❤)
- 算法基础及常见的算法(❤❤❤❤❤)
- 参考链接
数组与矩阵(❤❤)
稀疏矩阵
- 上三角矩阵
在矩阵中下标分别为i和j的元素,一维数组的下标计算公式:(2n-i+1) x i/2 + j - 下三角矩阵
在矩阵中下标分别为i和j的元素,对应的一维数组的下标计算公式为:(i+1) X i/2 + j
线性表(❤❤❤❤❤)
广义表(❤❤)
树与二叉树(❤❤❤❤❤)
相关术语
- 节点(node)
每个元素称为节点 - 根节点或树根(root)
有一个特定的节点被称为根节点或树根 - 节点的度
一个节点含有的子树的个数称为该节点的度(节点下面有几个叉) - 叶节点或终端节点
度为0的节点称为叶节点 - 分支节点或非终端节点
度不为0的节点 - 双亲节点或父节点
若一个节点含有子节点,则这个节点称为其子节点的父节点 - 孩子节点或子节点
一个节点含有的子树的根节点称为该节点的子节点 - 兄弟节点
具有相同父节点的节点互称为兄弟节点 - 树的度(Degree)
一棵树中,最大的节点的度称为树的度
称度为m的树为m叉树 - 节点的层次
从根开始定义起,根为第一层,根的子节点为第二层 - 树的高度或深度
树中节点的最大层次 - 堂兄弟节点
双亲在同一层的节点互为堂兄弟 - 节点的祖先
从根到该节点所经分支上的所有节点 - 子孙
以某节点为根的子树中任一节点都称为该节点的子孙 - 森林
由m(m>=0) 棵互不相交的树的集合称为森林
二叉树重要特性
- 二叉树分类
- 常用公式
- 在二叉树的第i层最多有 2^(i-1) 个节点(i>=1)
- 深度为k的二叉树最多有 (2^k) - 1 个节点(k>=1)
- 对任何一棵二叉树,如果其叶子节点数为n0,度为2的节点数为n2,则n0 = n2 + 1
二叉树遍历
- 先序遍历(DLR)
根节点 -> 左子树 -> 右子树
public static void DLR(BinaryNode node) {
// 访问根节点
System.out.print(node.data + " ");
// 遍历左子树
if (node.left != null) {
DLR(node.left);
}
// 遍历右子树
if (node.right != null) {
DLR(node.right);
}
}
- 中序遍历(LDR)
左子树 -> 根节点 -> 右子树
public static void LDR(BinaryNode node) {
// 遍历左子树
if (node.left != null) {
LDR(node.left);
}
// 访问根节点
System.out.print(node.data + " ");
// 遍历右子树
if (node.right != null) {
LDR(node.right);
}
}
- 后序遍历(LRD)
左子树 -> 右子树 -> 根节点
public static void LRD(BinaryNode node) {
// 遍历左子树
if (node.left != null) {
LRD(node.left);
}
// 遍历右子树
if (node.right != null) {
LRD(node.right);
}
// 访问根节点
System.out.print(node.data + " ");
}
反向构造二叉树
- 构造原则
- 有前序、中序可以反向构造
- 有中序、后序可以反向构造
- 只有前序、后序不能构造
- 构造样例
树转二叉树
查找二叉树
- 特点
左孩子节点小于根,右孩子节点大于根
平衡二叉树
- 特点
- 任意节点的左右子树深度相差不超过1;
- 每个节点的平衡度只能为-1、0或1
图(❤❤)
基本概念
- 完全图
在无向图中,若每对顶点之间都有一条边相连,则称该图为完全图
在有向图中,若每对顶点之间都有两条有向边相互连接,则称该图为完全图
邻接矩阵
- 表示方式
用一个n阶方阵R来存放图中各结点的关联信息,其矩阵元素Rij定义方式:
- 若顶点i到顶点j有邻接边,则Rij = 1
- 若顶点i到顶点j无邻接边,则Rij = 0
注意:若图的节点为n,边最少为n-1
图的存储
- 注意事项
邻接矩阵大小取决于节点数量 - 邻接表
首先把每个顶点的邻接顶点用链表示出来,然后用一个一堆数组来顺序存储上面每个链表的头指针。
图的遍历
- 遍历方法
深度优先、广度优先
拓扑排序
- AOV网络
我们把用有向边表示活动之间开始的先后关系。这种有向图称为用顶点表示活动网络,简称AOV网络
图的最小生成树
- 树和图的最大区别
不能形成环 - 常用算法
普里姆算法(Prim)
- 更适合与解决边的绸密度更高的连通网
具体思路是:普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)。
对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所走过的顶点和边就是该连通图的最小生成树。
克鲁斯卡尔算法(Kruskal)
- 更适合于求边稀疏的网的最小生成树
具体思路是:将所有边按照权值的大小进行升序排序,然后从小到大一一判断,条件为:如果这个边不会与之前选择的所有边组成回路,就可以作为最小生成树的一部分;反之,舍去。直到具有 n 个顶点的连通网筛选出来 n-1 条边为止。筛选出来的边和所有的顶点构成此连通网的最小生成树。
排序与查找(❤❤❤❤❤)
算法基础及常见的算法(❤❤❤❤❤)