树
树是不包含回路的连通无向图
二叉树:每个节点最多拥有2个子节点
满二叉树:n层满二叉树拥有2^n-1个节点
完全二叉树:除去第n层以外,是一个满二叉树,第n层也是从左到右排列
堆:堆是一种完全二叉树,满足父节点小于子节点,左子节点小于右子节点
二叉查找树:也叫二叉搜索树,如果父节点有左子节点,那么左子节点的值小于父节点,如果父节点有右子节点,那么右子节点大于父节点。
平衡二叉树:二叉平衡树的左右子树高度的差不大于1,任何子树都是一个平衡二叉树。
B数:B数也是一种平衡树,只是父节点由多个元素组成,可以降低树高。
B+数:
最小生成树
Prim算法:
核心思想:先找到最短的边,将最短边的两个顶点标记为已确定,然后再剩余的未确定的点里找距离已确定的顶点最近的点(距离最短),将顶点标记为已确定,依此类推,直到所有的顶点都被标记为已确定。
参考Dijkstra的思想,进行优化,用一个一维数组存储距离树的最短距离,没加入已确定的点之后,都对该点连接的边进行松弛,更新距离,初始化的时候需要选取一个点作为初始的树。
并查集
主要用于集合合并、查找集合中的元素,时间复杂度为n(*logn)。
核心思想:merge(x,y int)、getF(x int)
用一个一维数组,长度等于顶点数,下标表示顶点的编号,值表示该顶点所属的根顶点。
var input = [][2]int{
[2]int{1, 2},
[2]int{3, 4},
[2]int{5, 2},
[2]int{4, 6},
[2]int{2, 6},
[2]int{7, 11},
[2]int{8, 7},
[2]int{9, 7},
[2]int{9, 11},
[2]int{1, 6},
}
var fList = make(map[int]int)
func UnionFind() {
for i := 0; i <= 11; i++ {
fList[i] = i // 初始化时各自为王
}
for _, inp := range input {
left := inp[0]
right := inp[1]
merge(left, right)
}
}
func merge(x, y int) {
xf := getF(x)
yf := getF(y)
if xf != yf { // 判断两个不在同一个集合,合并两个集合,遵从靠左原则
fList[yf] = xf
}
}
func getF(v int) int {
if fList[v] == v {
return v
}
fList[v] = getF(fList[v]) //递归,在查找的过程中,压缩路径
return fList[v]
}
关键词:并(merge)、查(getF)、擒王、靠左、路径压缩。