让我来水一篇左偏树

#写在前面 这篇文章是瞎**写的 #左偏树——可合并的二叉堆 #它长啥样 http://pic.sogou.com/d?query=%D7%F3%C6%AB%CA%F7&mode=1&did=5#did4 #支持:合并、删除、插入等操作 删除:合并它的左右儿子 插入:把带插入元素当做一棵树,进行合并 #为啥叫左偏树:任意节点的左孩子距离大于右孩子距离 #两个属性 ①键值:用于比较节点大小 ②距离:dist #一些性质、引理、定理 性质1.节点的键值小于或等于它的左右子节点键值。 (左偏树的根节点是整棵树的最小节点,在O(1)的时间内完成取最小节点操作) 性质2.节点的左子节点距离>=右子节点的距离 (左偏树的左右子树都是左偏树) (左偏树是具有左偏性质的堆有序二叉树) 性质3.节点的距离等于它的右子节点的距离+1 (空节点的dist = -1) (空节点不是叶节点) 性质4:一棵N个节点的左偏树距离最多为└log(N+1)┘-1 引理1(左偏树的距离和节点数的关系)若左偏树的距离为一定值,则叶节点数最少的左偏树是完全二叉树 证明:根据性质2,对于一个节点i,有dist[rc[i]] == dist[lc[i]],节点数最少,为完全二叉树 定理1,若一棵左偏树的距离为k,则至少有2^(k+1)-1个节点 证明:完全二叉树,高度为k,节点数为2^(k+1)-1 #操作时间复杂度 合并(最坏)O(logN1+logN2) [N1N2为A.B节点个数] 插入:O(logn) 删除根节点: O(logn) 构建:(1) 暴力,逐个节点插入O(nlogn) (2)仿照二叉堆的构建 O(logn) ①将n个节点(每个节点作为一棵左偏树)放入先进先出队列 ②不断从对首取出两棵左偏树,将它们合并之后加入队尾 ③当队列中只剩一棵左子树后,算法结束 删除任意已知节点(不是根据键值) 我太菜了,不会 #板子 #include

猜你喜欢

转载自www.cnblogs.com/peppa/p/9332439.html