太晚了,不想碼字,其實這個思想真的很精妙,對於數字的應用,邏輯思路真的很巧妙清晰,如果有時間真的可以看看(資料結構與演算法分析)這本書的二項佇列的思路講解,但是我的**已經寫的很清晰了,對於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的位置。當然,它們的本質一樣 ...