轉自:http://m.blog.csdn.net/article/details?id=6901584node
PS:此做者寫的一步一步寫算法仍是比較好理解的算法
用過平衡二叉樹的朋友都清楚,平衡二叉樹的最大優勢就是排序。無論是在數據插入的時候仍是在數據刪除的時候,咱們都要考慮到數據的排序狀況。可是和數據的添加、刪除同樣重要的,還有數據的查詢。很不幸,平衡二叉樹常常因爲節點的添加和刪除,數據的查詢效率會變得很是低下。朋友們能夠看看下面這樣的一個極端場景,全部分支節點都只有一邊存在數據:spa
/* * 7 3 * / \ * 6 4 * / \ * 5 7 * / \ * 2 12 * / \ * 1 20 */
上面的這幅圖很能說明問題,雖然查詢七、6很方便,可是查詢五、二、1的時候效率就很是低了,右邊的二叉樹也是這種狀況。那麼有沒有辦法使得數據之間的查找效率不至於相差太大呢?截止目前爲止,主要有下面三種方法:.net
(1)哈希二叉樹指針
(2)avl樹code
(3)紅黑樹blog
今天咱們主要講解的內容就是哈希樹。其餘兩個內容會在後面的博客裏面介紹。排序
那麼什麼是哈希樹呢?其實也很是簡單,就是咱們在二叉樹節點中添加一個next指針,同時創建一個hash表,這樣咱們在查詢數據的時候就能夠直接利用hash查詢代替平衡二叉樹的查詢了。通常來講,哈希樹的節點應該是這樣定義的:get
typedef struct _HASH_TREE { int data; struct _HASH_TREE* next; struct _HASH_TREE* left; struct _HASH_TREE* right; }HASH_TREE;
其實,相比較普通的平衡二叉樹而言,也就是多了一個next指針而已,那麼這個next指針何時須要處理呢?主要就是在添加節點和刪除節點的時候處理。博客
STATUS add_node_into_tree(HASH_TREE** ppHash, int data) { /* add hash node into tree */ /* add hash node into hash table */ return TRUE; }
添加的代碼如此,刪除工做也比較相似。
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; }
說明:
(1)哈希二叉樹的思想比較重要,同窗們最好弄清楚爲何要創建hash二叉樹?
(2)上面的代碼不是很完整,對hash表不熟悉的朋友能夠參考我寫的這一篇博客(hash表),二叉樹添加刪除不熟悉的朋友一樣能夠參考我寫的另一篇博客(添加,刪除1,刪除2,刪除3),把兩部分代碼按照上面給出的結構合起來基本上就能夠實現哈希二叉樹了。