【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

用过平衡二叉树的朋友都清楚,平衡二叉树的最大优点就是排序。不管是在数据插入的时候还是在数据删除的时候,我们都要考虑到数据的排序情况。但是和数据的添加、删除一样重要的,还有数据的查询。很不幸,平衡二叉树经常由于节点的添加和删除,数据的查询效率会变得非常低下。朋友们可以看看下面这样的一个极端场景,所有分支节点都只有一边存在数据:

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

上面的这幅图很能说明问题,虽然查询7、6很方便,但是查询5、2、1的时候效率就非常低了,右边的二叉树也是这种情况。那么有没有办法使得数据之间的查找效率不至于相差太大呢?截止目前为止,主要有下面三种方法:

(1)哈希二叉树

(2)avl树

(3)红黑树

今天我们主要讲解的内容就是哈希树。其他两个内容会在后面的博客里面介绍。

那么什么是哈希树呢?其实也非常简单,就是我们在二叉树节点中添加一个next指针,同时建立一个hash表,这样我们在查询数据的时候就可以直接利用hash查询代替平衡二叉树的查询了。一般来说,哈希树的节点应该是这样定义的:

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

一步一步写算法(之哈希二叉树)相关推荐

  1. 一步一步写算法(之排序二叉树删除-1)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每 ...

  2. 一步一步写算法(之排序二叉树删除-3)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 3 普通节点的删除 3.1 删除的节点没有左子树,也没有右子树 测试用例1: 删除节点6 /* ...

  3. 一步一步写算法(之排序二叉树线索化)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们谈到了排序二叉树,还没有熟悉的同学可以看一下这个,二叉树基本操作.二叉树插入.二叉树删 ...

  4. 一步一步写算法(之排序二叉树插入)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 二叉树的节点插入比较简单.一般来说,二叉树的插入主要分为以下两个步骤: 1) 对当前的参数进行 ...

  5. 一步一步写算法(之排序二叉树)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们讲过双向链表的数据结构.每一个循环节点有两个指针,一个指向前面一个节点,一个指向后继节 ...

  6. 一步一步写算法(之排序二叉树的保存和加载)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 排序二叉树是我们开发中经常使用到的一种数据结构,它具有较好的插入.删除.查找特性.但是由于二叉 ...

  7. 一步一步写算法(之排序二叉树删除-2)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 2.4 删除节点的左右子树都存在,此时又会分成两种情形 1)左节点是当前左子树的最大节点,此时 ...

  8. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  9. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  10. 一步一步写算法(之寻找丢失的数)

    一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...

最新文章

  1. phaser.min.js_如何使用Phaser 3,Express和Socket.IO构建多人纸牌游戏
  2. bitcask存储引擎
  3. RHCS图形界面建立GFS共享上
  4. 基于js对象,操作属性、方法详解
  5. Ant-Design-Vue 安装
  6. python 反传播_岗位 | 滴滴急招反欺诈数据分析实习生(可转正)!字节跳动+德勤实习生项目热招中...
  7. C# DataTable学习
  8. python代码错误有哪些_在编写python代码时,小白最容易犯的十几个错误 !
  9. 电脑测试软件_一种笔记本电脑转轴扭力测试仪
  10. 微信养号防封攻略_防封群微信怎么卖
  11. 关闭绿联硬盘盒子自动休眠的方法!
  12. C语言-C语言程序的结构
  13. 微信公众平台开发问答
  14. windows下文件名太长无法删除的问题
  15. 2022山东国际养老服务业博览会,智慧养老产业展会
  16. Tektronix TBS1102B 示波器
  17. char *与char []的区别
  18. 一个淘宝店主真实的开店经历
  19. oracle调用apps,oracleEBS 调用 SHELL 的方法
  20. python部署到iis_IIS 部署 Python 环境

热门文章

  1. Xcode下的中文乱码问题
  2. angularsjs单独删除一条信息,不刷新页面
  3. 微信小程序开发的游戏《拼图游戏》
  4. 运维人员的解放----Docker快速部署
  5. 实时查看磁盘inode和block变化
  6. 用户名错误则一直登录
  7. 微软的判断一个数是不是质数的算法
  8. JAVA基础——异常详解
  9. 三,springboot集成mybatis
  10. 内存管理, 对象的生命周期