資料結構入門7 左偏樹

2021-08-07 01:11:41 字數 1057 閱讀 7315

一種可並堆,具有左偏性質。每個點有乙個距離。

距離則是如下定義的: 

節點i稱為外節點(externalnode),當且僅當節點i的左子樹或右子樹為空( left(i) = null或right(i) = null );節點i的距離(dist(i))是節點i到它的後代中,最近的外節點所經過的邊數。特別的,如果節點i本身是外節點,則它的距離為0;而空節點的距離規定為-1 (dist(null) =-1)。

左偏樹滿足下面兩條基本性質: 

1、堆性質

2、節點的左子節點的距離不小於右子節點的距離。 即dist(left(i))≥dist(right(i)) (左偏性質)。性質2是為了使我們可以以更小的代價(時間複雜度較小)插入節點或刪除最小節點操作後維持堆性質。

左偏樹的左右子樹也是左偏樹。

如果不滿足左偏條件,則將左右兒子交換。

模板題(洛谷)

模板題(bzoj1455)

bzoj1455**:

//serene

#include#include#include#include#include#includeusing namespace std;

const int maxn=1e6+10;

int n,m,fa[maxn],num[maxn],son[maxn][2],len[maxn];

int aa;char cc;

int read()

int find(int x)

int merge(int x,int y)

void del(int x)

printf("%d\n",num[x]);

fa[son[x][0]]=son[x][0];fa[son[x][1]]=son[x][1];

if(son[x][1]&&son[x][0]) merge(son[x][0],son[x][1]);

len[x]=0;son[x][0]=son[x][1]=0;

}int main()

else del(y);

} return 0;

}

資料結構 左偏樹

今天學了左偏樹,看了一天,一些細節還是不太明白。有點混亂。做題的時候也不是很明白方法。先來介紹左偏樹 見 資料結構 9 左偏樹 見例題 判斷是否認識,並查集。因為要用到合併,而且輸出最強壯值,二叉堆不能合併,所有要用到能夠合併的資料結構 左偏樹。這題能夠好好理解左偏樹的實現方法。include in...

資料結構 左偏樹

題目描述 如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除,則輸出 ...

高階資料結構 左偏樹

我們曾經學習過基礎資料結構之一 堆 heap 堆支援三種操作 以小根堆為例 1 查詢 query 查詢堆中最小的元素 2 刪除 del 刪除堆中的任意乙個元素 3 插入 insert 插入乙個新元素 4 維護 modify 維護堆的性質 任何非葉子結點的權值都大於它的所有子結點。在刪除和插入後進行維...