左偏樹,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一下...