1.1 树的基本术语
- 树:一对多的结构(1对0,1对1,1对多),有根节点
- 结点:树的一个数据元素
- 孩子:1对多里面的多
- 子树:以某个孩子结点为根的一棵树
- 叶子结点:没有孩子的结点
- 森林:多颗树
1.2 二叉树
每个结点至多有两个孩子,分别称为左孩子和右孩子
- 左孩子若有左子树的根
- 右孩子若有是右子树的根
- 高度(深度):最深的叶子结点所在的层数
二叉树重要性质
第 i 层至多有2的 i-1 次方个结点
高度为n的树至多有2的 n-1 个结点
两种特殊的二叉树
满二叉树: 高为n 有 2的n 次方 - 1个结点
完全二叉树: 只在二叉树的最下层的最右边有空缺
1.3 二叉树的顺序存储
二叉树以层序遍历的顺序存入数组中
- 第i个结点的左右孩子分别是2i+1和2i+2 (i从0开始计数)
- 结点为空时使用特殊值表示(0)
1.4 二叉树的链式实现
在结点中定义一个数据域,以及该结点的左子树、右子树。
1.5 二叉树的遍历
- 先序遍历:先根节点->左子树->右子树
- 中序遍历:左子树->当前结点->右子树
- 后序遍历:左子树->右子树->当前结点
- 层序遍历:逐层从左向右遍历各个结点
1.6 哈夫曼树和哈夫曼编码
- 越靠近根节点的权值越大
- 初始结点全是后来的叶子结点
- 叶子节点权值越大,离根结点越近 => 路径越短
- 最大程度的节省空间,越常用的字符码长越短
1.7 无向图和有向图
在一个无向图中,所有结点的度数之和为边数的2倍
在一个有向图中,所有顶点的出度之和等于所有顶点的入度和
- 无向无权图:
- 用1表示有边相连,0表示无边
- 矩阵是对称的 - 有向加权图:
- Mij 表示点到点之间的距离(权值)
- 如果不连通用 无穷符号代替
- i = j 时表示为0
1.8 邻接表
- 优点:在边少情况下节省许多空间, 适用于稀疏图
- 缺点:无法直接获取某条边的信息,要在链表进行从头顺序存取,最坏情况O(n)
1.9 图的DFS和BFS
- DFS 深度优先遍历: 选择一个结点作为初始结点,遇到新邻居就进栈,直到没有邻居了开始出栈。优先进入后来遇到的邻居(递归、栈实现)
- BFS 广度优先遍历:先把当前结点的邻居都遍历完,再按先来后到遍历的方式遍历邻居的邻居们,逐层向外扩张。优先进入先访问的邻居的邻居 (队列)