基於二叉查詢樹的集合

2021-09-22 06:58:26 字數 1981 閱讀 6116

我們都知道dictionary查詢元素非常快,其實現原理是:將你tkey的值雜湊到陣列的指定位置,將tvalue的值存入對應的位置,

由於取和存用的是同乙個演算法,所以就很容易定位到tvalue的位置,花費的時間基本上就是實現雜湊演算法的時間,跟其中元素的個數沒有關係,

故取值的時間複雜度為o(1)。

集合無非都是基於最基礎語法的陣列,先欲分配,然後向其中新增元素,容量不夠就建立乙個2倍容量的陣列,將之前的元素賦值過來,將之前的陣列**,

但基於雜湊演算法的集合這點上有點不同,他並不是每次建立乙個2倍容量的陣列,為了讓元素均勻的分布到陣列上,陣列的容量是這麼增長的:3,7,11,17,23,29,37,47,59,71,89,107,131,163,197,239,293,353,431,521,631,761,919,1103...

以質數的方式增長。由於每次擴充陣列的容量較小,如果要向其中新增很多元素的話,程式設計師又沒有預先分配記憶體,那就會出現多次陣列的建立、複製和**。

一直想做個有用的東西出來,讓想用的人用,又能讓自己練練手,於是這次做了乙個基於二叉查詢樹的集合,我們知道在二叉查詢樹中查詢元素的最優時間複雜度是o(logn)即在滿二叉樹的情況下,最壞時間複雜度是o(n)即除葉子節點外每個節點只有乙個子節點,

查詢元素它也是很快的哦,而且查詢的時候都只是做int型的比較,而dictionary是基於乙個雜湊演算法,當然基於二插查詢樹的集合也有自身的缺點:

1:元素必須實現介面ibinarytree,其屬性comparevalue主要用於比較生成二叉查詢樹

2:元素必須是可以new的,即不支援基礎型別int,char,string等

3:每個節點都有左右兩個子節點,他們只是起到指標的作用,指向該節點的子節點,只需占用額外的少量記憶體 

4:基本上都是基於遞迴實現,元素過多的話,會棧溢位,至於原因請看我的這篇部落格

優點是常用的一些功能都有,功能如下,練手嗎,但會一直優化下去

public

class binarytree: idisposable, ienumerable, ienumerable where t :ibinarytree, new()

//元素個數

public t this[ibinarytree ibinarytree] //

陣列索引直接訪問元素

public

void add(t t);//

新增元素

public

void clear();//

清除所有元素

public

bool contains(t ibinarytree);//

是否包含自定元素

public

void dispose();//

釋放資源,支援using

public t find(ibinarytree ibinarytree);//

查詢元素

public t find(ibinarytree ibinarytree, treenodenode);//

在指定的節點下查詢元素

public t findmax();//

最大元素

public t findmin();//

最小元素

public t findmin(treenodenode);//

在指定的節點下查詢最小元素

public ienumeratorgetenumerator();//

返回所有元素,支援foreach

public treenoderemove(t t);//

刪除元素

public treenoderemove(ibinarytree ibinarytree, treenodenode);//

在指定的節點下刪除元素

public ienumerablesort();//

排序(公升序)

public ienumerabletolist();//

返回所有元素

}

部落格:

二叉樹 二叉查詢樹

構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...

二叉樹 二叉查詢樹

二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...

樹(樹,二叉樹,二叉查詢樹)

1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...