这是本文档旧的修订版!
堆:
完全二叉树,用数组模拟时,父亲节点的下标是儿子的$frac{1}{2}$(整数部分)(同线段树)
(以小根堆为例)根节点小于儿子节点。
操作: 上浮:某个节点与其父亲比较,如果小于父亲就和父亲交换 下沉:某个节点与两个儿子比较,若大于某个儿子与小的一个儿子交换 插入:插入到最后,然后上浮 弹出:将根与最后一个点交换,再下沉。
我们定义一个节点为外节点,当且仅当这个节点的左子树和右子树中的一个是空节点。一个点的距离,被定义为它子树中离他最近的外节点到这个节点的距离。
性质:
1.左偏树中,任何一个节点的父节点的权值都要小于等于这个节点的权值(堆性质)
2.左偏树中任意一个节点的左儿子的距离一定大于等于右儿子的距离(左偏性质)
推论1. 左偏树中任意一个节点的距离为其右儿子的距离+1
推论2. n个点的左偏树,距离最大为log(n+1)−1
左偏树的合并:(和treap类似)
1.如果x为空树返回y,y为空返回x
2.val[x]>val[y] swap(x,y)
3.递归rson[x],y
4.检查左右儿子是否符合性质,否则交换
5.更新节点距离(右儿子+1)
模板: