首页 > 代码库 > 左偏树

左偏树

 

概要:左偏树是具有左偏性质的堆有序二叉树,它相比于优先队列,能够实现合并堆的功能。

先仪式型orzorzozr国家集训队论文https://wenku.baidu.com/view/515f76e90975f46527d3e1d5.html

 

左偏树的节点定义:

技术分享
1 struct node {
2     int lc, rc, val, dis;
3 } LTree[maxn];
View Code

左偏树的几个基本性质如下:

  1. 节点的键值小于等于它的左右子节点的键值
  2. 节点的左子节点的距离不小于右子节点的距离
  3. 节点的距离等于右子节点的距离加一,由此可推出一个引理和一个定理:
    1.   若左子树的距离为一定值,则节点数最少的左偏树是完全二叉树
    2. 若一棵左偏树的距离为k,则这颗左偏树至少有2k+1-1个节点

  4.一棵N个节点的左偏树的距离最多为[log(N+1)]-1

 

左偏树的基本操作

  1. 合并操作(事实上操作时始终把B插入A中)

    函数返回的是合并后的树的根节点

    首先特判是否存在空树

    然后注意到左偏树我们需要保证根节点键值不大于两个子节点的键值,此处我们需要特判A、B的键值,决定swap函数的调用与否(维护性质1)

    接着判断A的左右子树的距离,决定是否调用swap(维护性质2)

    最后根据A右子树的距离生成A的距离(维护性质3)

  2.插入节点

    将B节点视为一棵左偏树,合并A、B即可

  3.删除最小(大)节点

    等同于合并根节点的左右子树

 

附题:http://acm.hdu.edu.cn/showproblem.php?pid=1512

先到这里QAQ 

左偏树