左偏樹,原理及模板

2021-07-25 20:36:05 字數 994 閱讀 4583

左偏樹,leftist tree。首先是乙個堆,即

node<=node.leftchild

&&node<=node.rightchild 。

對於樹中任意乙個節點,左孩子的distance >= 右孩子的distance。

將當前樹補全為擴充套件二叉樹。當前節點到最近的葉子節點的距離即為該節點的distance,維基百科中叫s-value。

可以用作優先佇列。

一般的堆,希望盡量平衡,這樣元素調整次數少,但左偏樹的特點就是不平衡,它的適用場景是什麼?——用於多個堆的快速合併。

合併a與b兩棵樹。比較a和b的key值,若a的key值 < b的,把a的右子樹和b合併,新樹作為a的右子樹。若此時不滿足左偏定義,互換a的左右子樹。

若a的key值大於b,把前面的步驟反過即可。

合併左兒子和右兒子。

插入點作為一棵只有乙個節點的樹,然後和原有的左偏樹合併。

#include

using namespace std;

struct leftisttreenode

static void setnodes(leftisttreenode *tree)

/*** * @param a tree

* @param b tree

* @return new root

*/int merge(int a, int b)

/*** @param a tree

* @param b new node

* @return new root

*/int insert(int a, int b)

/*** delete the top element and return new root

*/int pop(int a)

};//靜態成員,類內宣告類外初始化

leftisttreenode* leftisttreenode::nodes = null;

左偏樹 模板

神經病也可以寫成右偏樹 具體左偏指左節點的距離 geq 右節點的距離 距離指離最近擁有空節點的節點的距離 乙個節點的值一定 或 leq 或 geq 或 其子節點的值 由於左偏性質,每次可以合併至右邊,維護左偏性質後就可以保證複雜度 被踩爆的板子 或者是我?include define ls lson...

模板 左偏樹

洛谷模板題 一聽左偏樹這個名字就感覺左偏。左偏樹是什麼,好像就是個堆,大根堆或小根堆,可以支援合併,取堆頂元素,刪除堆頂元素,插入元素的操作。一些說明 左偏樹節點除了應有的東西,還有鍵值和距離,鍵值用於比較大小,距離是什麼?距離是這樣定義的 節點i稱為外節點 external node 當且僅當節點...

模板 左偏樹

可在log複雜度合併的堆 每個節點有乙個距離,具體定義我不知道 1.滿足堆的性質 2.左子節點距離 右子節點 3.節點距離 右子節點距離加1 按照以上的性質實現merge x,y 先選出x,y中比較大的那個 大根堆為例 再拿它的右兒子和另乙個去merge,如果merge出來不符合性質2就swap一下...