转自: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),把两部分代码按照上面给出的结构合起来基本上就能够实现哈希二叉树了。