一步一步写算法(之哈希二叉树)

简介: 原文: 一步一步写算法(之哈希二叉树) 【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     用过平衡二叉树的朋友都清楚,平衡二叉树的最大优点就是排序。
原文: 一步一步写算法(之哈希二叉树)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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),把两部分代码按照上面给出的结构合起来基本上就可以实现哈希二叉树了。




目录
相关文章
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
299 3
|
9月前
|
存储 监控 算法
内网监控桌面与 PHP 哈希算法:从数据追踪到行为审计的技术解析
本文探讨了内网监控桌面系统的技术需求与数据结构选型,重点分析了哈希算法在企业内网安全管理中的应用。通过PHP语言实现的SHA-256算法,可有效支持软件准入控制、数据传输审计及操作日志存证等功能。文章还介绍了性能优化策略(如分块哈希计算和并行处理)与安全增强措施(如盐值强化和动态更新),并展望了哈希算法在图像处理、网络流量分析等领域的扩展应用。最终强调了构建完整内网安全闭环的重要性,为企业数字资产保护提供技术支撑。
265 2
|
11月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
361 10
 算法系列之数据结构-二叉树
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
371 64
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
597 3
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
237 5
|
算法 安全
散列值使用相同的哈希算法
当使用相同的哈希算法对相同的数据进行散列时,所产生的散列值(也称为哈希值或摘要)总是相同的。这是因为哈希算法是一种确定性的函数,它对于给定的输入将始终产生相同的输出。 例如,如果你用SHA-256算法对字符串"hello world"进行哈希处理,无论何时何地,只要输入是完全一样的字符串,你都会得到相同的160位(40个十六进制字符)的SHA-256散列值。 但是,需要注意的是,即使是输入数据的微小变化也会导致产生的散列值完全不同。此外,不同的哈希算法(如MD5、SHA-1、SHA-256等)会对相同的数据产生不同的散列值。 哈希算法的一个关键特性是它们的“雪崩效应”,即输入中的一点小小
319 4
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
406 5
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
885 0
|
存储 算法 C#
C#哈希查找算法
C#哈希查找算法
153 1

热门文章

最新文章