在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 哈希二叉樹(shù)
hash表
單詞統(tǒng)計(jì)
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹(shù)的保存和加載
圖添加和刪除
排序二叉樹(shù)線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹(shù)深度遍歷
線性隊(duì)列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹(shù)
大數(shù)計(jì)算
二叉樹(shù)廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫(xiě)
哈夫曼樹(shù) 下
線性堆棧
八皇后
排序二叉樹(shù)刪除-1
挑選最大的n個(gè)數(shù)
字符串查找 中篇
哈夫曼樹(shù) 上
合并排序
回?cái)?shù)
選擇排序
哈希二叉樹(shù)
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹(shù)插入
圖的保存
排序二叉樹(shù)刪除-2
排序二叉樹(shù)刪除-3
n!中末尾零的個(gè)數(shù)統(tǒng)計(jì)

哈希二叉樹(shù)

用過(guò)平衡二叉樹(shù)的朋友都清楚,平衡二叉樹(shù)的最大優(yōu)點(diǎn)就是排序。不管是在數(shù)據(jù)插入的時(shí)候還是在數(shù)據(jù)刪除的時(shí)候,我們都要考慮到數(shù)據(jù)的排序情況。但是和數(shù)據(jù)的添加、刪除一樣重要的,還有數(shù)據(jù)的查詢(xún)。很不幸,平衡二叉樹(shù)經(jīng)常由于節(jié)點(diǎn)的添加和刪除,數(shù)據(jù)的查詢(xún)效率會(huì)變得非常低下。朋友們可以看看下面這樣的一個(gè)極端場(chǎng)景,所有分支節(jié)點(diǎn)都只有一邊存在數(shù)據(jù):

/* 
*         7        3 
*        /           \ 
*       6             4 
*      /                \ 
*     5                  7 
*    /                    \ 
*   2                     12 
*  /                        \ 
* 1                         20 
*/  

上面的這幅圖很能說(shuō)明問(wèn)題,雖然查詢(xún)7、6很方便,但是查詢(xún)5、2、1的時(shí)候效率就非常低了,右邊的二叉樹(shù)也是這種情況。那么有沒(méi)有辦法使得數(shù)據(jù)之間的查找效率不至于相差太大呢?截止目前為止,主要有下面三種方法:

(1)哈希二叉樹(shù)

(2)avl樹(shù)

(3)紅黑樹(shù)

今天我們主要講解的內(nèi)容就是哈希樹(shù)。其他兩個(gè)內(nèi)容會(huì)在后面的博客里面介紹。

那么什么是哈希樹(shù)呢?其實(shí)也非常簡(jiǎn)單,就是我們?cè)诙鏄?shù)節(jié)點(diǎn)中添加一個(gè)next指針,同時(shí)建立一個(gè)hash表,這樣我們?cè)诓樵?xún)數(shù)據(jù)的時(shí)候就可以直接利用hash查詢(xún)代替平衡二叉樹(shù)的查詢(xún)了。一般來(lái)說(shuō),哈希樹(shù)的節(jié)點(diǎn)應(yīng)該是這樣定義的:

typedef struct _HASH_TREE  
{  
    int data;  
    struct _HASH_TREE* next;  
    struct _HASH_TREE* left;  
    struct _HASH_TREE* right;  
}HASH_TREE;  
``

其實(shí),相比較普通的平衡二叉樹(shù)而言,也就是多了一個(gè)next指針而已,那么這個(gè)next指針什么時(shí)候需要處理呢?主要就是在添加節(jié)點(diǎn)和刪除節(jié)點(diǎn)的時(shí)候處理。

STATUS add_node_into_tree(HASH_TREE** ppHash, int data)
{

/* add hash node into tree */  

/* add hash node into hash table */  

return TRUE;  

}


添加的代碼如此,刪除工作也比較類(lèi)似。

STATUS delete_node_from_tree(HASH_TREE* ppHash, int data)
{
HASH_TREE
pNode;
/ delete hash node from tree, but not free space/

/* delete hash node from hash table */  

free(pNode);  
return TRUE;  

}



說(shuō)明:

(1)哈希二叉樹(shù)的思想比較重要,同學(xué)們最好弄清楚為什么要建立hash二叉樹(shù)?

(2)上面的代碼不是很完整,對(duì)hash表不熟悉的朋友可以參考我寫(xiě)的這一篇博客(hash表),二叉樹(shù)添加刪除不熟悉的朋友同樣可以參考我寫(xiě)的另外一篇博客(添加,刪除1,刪除2,刪除3),把兩部分代碼按照上面給出的結(jié)構(gòu)合起來(lái)基本上就可以實(shí)現(xiàn)哈希二叉樹(shù)了。
上一篇:內(nèi)存下一篇:線性堆棧