二十五 資料結構之二項佇列(堆序森林)

2021-09-25 01:58:03 字數 1807 閱讀 7307

太晚了,不想碼字,其實這個思想真的很精妙,對於數字的應用,邏輯思路真的很巧妙清晰,如果有時間真的可以看看(資料結構與演算法分析)這本書的二項佇列的思路講解,但是我的**已經寫的很清晰了,對於d-堆永遠都離不開合併操作,所以不管出於什麼樣的設計思想,合併永遠是重中之重,而二項佇列相比較前兩種實現,他的合併操作完全可以達到常數時間,所以有必要研究通他的設計思想。我的合併操作的注釋很清晰,完全可以理解,同時也提供了合併最小值的實現,感謝閱讀。

#include #include //定義最大儲存7個二項式佇列

#define maxtree 7

//定義儲存的最大節點數

#define capacity 127

//定義無窮大的數

#define infinity 1 << 30

//定義資料型別

typedef int elemtype;

//定義二項式樹的儲存結構

typedef struct binomialnode

binomialnode, *position, *bintree;

//定義二項式佇列

typedef struct binqueuenode

binqueuenode, *binqueue;

//獲取乙個初始化的二項式佇列

binqueue initialization()

queue -> size = 0;

return queue;

}//組合相同長度的二項式樹

bintree combine(bintree t1, bintree t2)

t2 -> nextsibling = t1 -> leftchild;

t1 -> leftchild = t2;

return t1;

}//對兩個二項式佇列進行合併

binqueue merge(binqueue q1, binqueue q2)

bintree t1, t2, carry = null; //t1 : q1的二項式樹, t2 : q2的二項式樹 carry : t1 和 t2合併後生成的二項式樹

q1 -> size += q2 -> size;

int i, j;

for(i = 0 , j = 1; j <= q1 -> size; i++, j *= 2)

}return q1;

}//新增新的元素

void insert(elemtype data, binqueue queue)

//刪除最小元素,並返回該值

elemtype deletemin(binqueue queue)

int minnum = infinity;

int mintree;

for(int i = 0; i < maxtree; i++) }

binqueue delqueue = initialization();

position deltreenode = queue -> thetree[mintree];

position deltree = deltreenode -> leftchild;

free(deltreenode);

queue -> thetree[mintree] = null;

for(int i = mintree - 1; i >= 0; i--)

merge(queue, delqueue);

queue -> size--;

return minnum;

}int main(void)

C 資料結構之二叉查詢樹 二十五

參考了獵豹網校 引用部落格 二叉查詢樹與平衡二叉樹 二叉查詢樹的插入演算法比較簡單 空樹,就首先生成根節點 不是空樹就按照查詢的演算法,找到父節點,然後作為葉子節點插入,如果值已經存在就插入失敗。刪除操作稍微複雜一點,有如下幾種情況 1 如果刪除的是葉節點,可以直接刪除 2 如果被刪除的元素有乙個子...

資料結構之(二叉)堆

二叉 堆是乙個陣列,是一顆近似完全二叉樹,分為大頂堆 小頂堆。表示堆的陣列a有兩個屬性 1 a.length表示陣列元素的個數 2 a.heap size表示有多少個堆元素儲存在陣列a中。更多的關於堆的性質的介紹 演算法導論第三版 p85 p89 程式設計珠璣 p141 p145。堆的操作主要包括堆...

資料結構之二叉堆

二叉堆的介紹 二叉堆是完全二元樹或者是近似完全二元樹,按照資料的排列方式可以分為兩種 最大堆和最小堆。示意圖如下 二叉堆一般都通過 陣列 來實現。陣列實現的二叉堆,父節點和子節點的位置存在一定的關係。有時候,我們將 二叉堆的第乙個元素 放在陣列索引0的位置,有時候放在1的位置。當然,它們的本質一樣 ...