左式堆:同二叉堆一樣具有結構性和堆序性。惟一的區別是:左式堆不是理想平衡的,而實際上是趨於不平衡的。
零路徑長(npl(x)):從節點x到乙個沒有兩個兒子節點的最短路徑長。
左式堆要求對於堆中的每乙個節點x,左兒子的零路徑長至少與右兒子的零路徑長一樣大。
左式堆的結構宣告:
struct treenode;
typedef struct treenode *priorityqueue;
struct treenode
;priorityqueue initialize(priorityqueue h);
void swapchildren(priorityqueue h);
priorityqueue merge(priorityqueue h1, priorityqueue h2);
static priorityqueue merge1(priorityqueue h1, priorityqueue h2);
priorityqueue insert1(int x, priorityqueue h);
int isempty(priorityqueue h);
priorityqueue deletemin1(priorityqueue h);
void printqueue(priorityqueue h);
合併左式堆的驅動例程:
priorityqueue merge(priorityqueue h1, priorityqueue h2)
合併左式堆的實際例程:
void swapchildren(priorityqueue h)
static priorityqueue merge1(priorityqueue h1, priorityqueue h2)
return h1;
}
插入例程:
priorityqueue insert1(int x, priorityqueue h)
return h;
}
deletemin例程:
int isempty(priorityqueue h)
priorityqueue deletemin1(priorityqueue h)
leftheap = h->left;
rightheap = h->right;
free(h);
return merge(leftheap, rightheap);
}
左式堆實現
左式堆是為了方便合併操作實現的。左式堆性質 任意節點x的零路徑長是x到任意沒有兩個兒子的節點的最短路徑。任意乙個節點的零路徑長比他兒子的零路徑長的最大值大1,null的零路徑長是 1 對於x來說,他的左兒子的零路徑長要大於等於右兒子。通過遞迴實現 如下 public class leftisthea...
資料結構 堆
最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...
資料結構 堆
資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...