真左偏树:
忽略忽略
下边才是(图源百度):
概念:
左偏树是是一颗具有堆性质的二叉树。属于可并堆。
它的节点除了和二叉树的节点一样具有左右子树的指针 ( l i g h t , r i g h t ) (light,right) (light,right)外,话有两个性质:键值和距离 ( d i s t ) (dist) (dist)。
键值用于比较节点的大小
距离定义: 当且仅当节点 i i i的左子树和右子树为空树的时候,节点被称作外节点,节点的距离是节点 i i i到它的后代中的距离最近的外节点的边数。特别的,如果节点 i i i本身就是外节点,则它的距离为0;而空节点的距离视为 − 1 -1 −1
性质
-
节点的键值小于或等于它的左右子节点的键值
-
节点的左节点的距离不小于右子节点的距离
推论
-
节点的距离等于它的右子节点的距离+1
-
一棵 N N N个节点的左偏树 r o o t root root节点的距离最多为 l o g ( N + 1 ) − 1 log(N+1)-1 log(N+1)−1
证明: 左偏树根节点的距离一定,那么节点最少的情况下就是一棵完全二叉树,节点数是 2 d + 1 − 1 2^{d+1}-1 2d+1−1,那么 n n n个节点的左偏树的距离也就 ≤ l o g ( n + 1 ) − 1 \leq log(n+1)-1 ≤log(n+1)−1.
这也是左偏树时间复杂度的保证。
合并操作
合并操作是左偏树最基本的操作。merge打天下!!
左偏树增加一个节点,删除根节点,初始化一批数据都是基于合并操作。
假设我们现在合并 x x x和 y y y两棵树
-
比较两棵树值的大小,假设 x . v a l < y . v a l x.val < y.val x.val<y.val
-
将值小的节点 ( x ) (x) (x)作为根节点,递归合并 x x x的右子树和 y y y
-
若合并后不满足左偏性质,交换左右子树
-
当 x x x的右子树或