树
树的概述
- 树:没有简单回路的连通无向图
- 森林:没有简单回路的无向图
- 一个无向图是树当且仅当在它的每对顶点之间存在唯一简单通路
- 子树:树的子图,该子图本身也是一棵树
- 内点:具有孩子的顶点
- 树叶:没有孩子的顶点
- 顶点的层:从根到这个顶点的通路的长度
- 树的高度:树里顶点的最大层数
- 有根树:指定一个顶点作为根并且每条边的方向都离开根的树
- m叉树:有根树的每个内点都有不超过m个孩子
- 满m叉树:m叉树的每个内点恰好有m个孩子
- 二叉树:m=2的m叉树
- 带有n个顶点的树含有n-1条边
- 带有i个内点的满m叉树含有n=mi+1个顶点
- 一个满叉树若有
- n个顶点,则有 i = ( n − 1 ) / m i=(n-1)/m i=(n−1)/m个内点和 l = [ ( m − 1 ) n + 1 ] / m l=[(m-1)n+1]/m l=[(m−1)n+1]/m个树叶
- i个内点,则有 n = m i + 1 n=mi+1 n=mi+1个顶点和 l = ( m − 1 ) i + 1 l=(m-1)i+1 l=(m−1)i+1个树叶
- l个树叶,则有 n = ( m l − 1 ) / ( m − 1 ) n=(ml-1)/(m-1) n=(ml−1)/(m−1)个顶点和 i = ( l − 1 ) / ( m − 1 ) i=(l-1)/(m-1) i=(l−1)/(m−1)个内点
- 平衡m叉树:一颗高度为h的m叉树的所有树叶都在h层或h-1层
- 在高度为h的m叉树中至多有 m h m^h mh个树叶
树的应用
- 二叉搜索树:二叉树,在其中以元素对顶点进行标记,使得一个顶点的标记大于这个顶点的左子树里所有顶点的标记,并且小于这个顶点右子树里所有顶点的标记
- 决策树:在有根树的每个顶点表示一次决策的可能输出,而树叶表示可能的解
- 前缀码:一种编码,其中一个字符的编码永远不是另一个字符的编码的前缀
- 哈夫曼编码:给定一组符号的频率,为这些符号构造最优二元码的过程
- 博弈树:顶点表示博弈过程中的局面,边表示这些局面间的合法移动的有根树
树的遍历
- 树的遍历:树的顶点的列表
- 遍历算法
- 前序遍历:先列出根,接着列出第一课子树,接着从左到右的出现顺序列出其余子树
- 中序遍历:先列出第一课子树,接着列出根,接着以左到右的出现顺序列出其余子树
- 后序遍历:以从左到右的出现顺序列出各子树,接着列出根
生成树
- 生成树:包含图的所有顶点的树
- 简单图是连通的当且仅当它有生成树
- 深度优先搜索(回溯):构造生成树的过程,通过添加形成通路的边,直到不可能这样做为止,然后沿着这条通路往回移动,直到找到可以形成新的通路的顶点为止
- 宽带优先搜索:构造生成树的过程,通过一次添加与上次添加的边相关联的所有边,除非形成简单回路
- 回溯的应用
- 图着色
- n皇后问题
- 子集之和
最小生成树
- 最小生成树:连通加权图里的最小生成树是具有边的权之和最小的生成树
- 普林算法:产生加权图里最小生成树的过程,通过依次添加与已经在树里的顶点相关联的所有边中权最小的边,使得再添加边时不会产生简单回路
- 克鲁斯卡尔算法:产生加权图里最小生成树的过程,通过依次添加还不在树里的权最小的边,使其再添加边时不会产生简单回路
鲁斯卡尔算法:产生加权图里最小生成树的过程,通过依次添加还不在树里的权最小的边,使其再添加边时不会产生简单回路