数据结构-树

树是不包含回路的连通无向图

二叉树:每个节点最多拥有2个子节点

满二叉树:n层满二叉树拥有2^n-1个节点

完全二叉树:除去第n层以外,是一个满二叉树,第n层也是从左到右排列

堆:堆是一种完全二叉树,满足父节点小于子节点,左子节点小于右子节点

二叉查找树:也叫二叉搜索树,如果父节点有左子节点,那么左子节点的值小于父节点,如果父节点有右子节点,那么右子节点大于父节点。

平衡二叉树:二叉平衡树的左右子树高度的差不大于1,任何子树都是一个平衡二叉树。

B数: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)、擒王、靠左、路径压缩。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值