二进制树在存储分层数据中是否有特定目的?它们的规范用法是什么?


12

我了解二叉树的结构以及如何遍历它们。但是,我正在努力实现它们在程序和编程中的实际用途,目的。当我想到分层数据的“现实生活”示例时,几乎可以肯定他们有两个以上的子级。例如,在家谱中,一位母亲可能经常有两个以上的孩子。

由于对数组和列表的处理速度更快,“二叉树”真的只对存储线性相关的数据有用吗?或者,它们在存储分层数据中是否有特定目的?如果是这样,那么二叉树的应用实例有哪些。一个节点最多有两个孩子的数据是什么?


我认为二叉树的主要用途是对数据​​进行排序。https://zh.wikipedia.org/wiki/Binary_search_tree
Mandrill

Answers:


25

不,二进制树不能用于您所考虑的层次结构数据。n元树的主要用例n是固定数量的快速搜索功能,而不是语义层次结构。

请记住,在旧游戏中,一个人想到一个1到100之间的数字,而另一个人则必须尽可能少地猜测它,如果您猜错了,那么想到这个数字的人就必须告诉您您是否也是如此高还是低?一段时间后,它会变得无聊,因为您很快就知道应该始终从50开始,然后转到25或75,然后在每次新的猜测之后将要搜索的范围划分为一半,最终您可以猜测任何数字最多保证有7个猜测。

它可能不会使游戏变得有趣,但是该属性正是使二叉树(以及其他n叉树)有用的原因:您可以使用它们在非常短的时间内搜索很大的数据集。


优秀答案非常感谢。因此,二叉树实际上只是用于存储数据的另一种结构,就像在数组或列表中那样,但是具有快速搜索功能的其他好处?
sw123456

1
@ sw123456:是的。与任何工程技术一样,它带有折衷(与具有相同数量元素的数组相比,使用更多(和更多碎片)的内存,O(n)访问数据集的元素#n而不是O(1)访问等),但快速搜索绝对是二叉树的主要好处。
梅森惠勒2015年

@ sw123456很高兴能为您提供帮助:)
Mason Wheeler

3
当树平衡时,对元素的访问为O(log(n))。O(n)退化时将是最坏的情况(大多数节点只有一个括号)。
Mandrill

@ sw123456网络路由对称为Trie的二叉树进行了略微修改(为提高问题域的效率而创建)。当路由器在查找IP地址以查找应将数据包转发到的位置时,它逐位遍历树时,它确实存储了层次结构信息。IP地址本质上也是分层的,因此遍历IP以查找最长的前缀匹配时,路由器将遍历IP层次结构,子网IP等。从语义上看,这不是很明显,但是存在这种关系。梅森回答说,路由器使用这种结构来提高查找效率。
克里斯·西里菲斯

3

可以使用二叉树来实现任何树结构,其中一个节点可以有无限数量的子级。

对于树中的每个节点,将其替换为带有左右指针的节点。左指针指向该节点的第一个孩子。右节点转到该节点的下一个兄弟节点。给定节点的所有子节点都在一个链接列表中,并由其右指针连接,列表的头部由其父节点的左指针指向。

您复杂的n元树已变成简单的二叉树。

我确定这是在Knuth,Vol。1个地方。


这是一个非常有趣的实现。我是否认为是正确的,因为每个子节点都是链表的开始,因此如果访问平衡,则树将不再是O(log)n,否则将不再是O(n)。线性搜索?此实现会导致搜索时间大大缩短吗?但从好的方面来说,搜索时间将比标准线性结构的搜索时间更快?我理解正确吗?
sw123456

@ sw123456,如果原始树是平衡的,则几乎可以肯定最终的二叉树将不会。我相信其他所有因素都将取决于树上的风扇,任何给定节点有多少个孩子。线性搜索仅在找出要遵循的给定节点的子代中时才会发生。但是我不确定您是否可以在n元树的任何其他实现中避免这种情况。
Justsalt 2015年

2

二叉树为什么要使用它们?

在编程中,您需要处理大量相同类型的数据。

存储此数据的两种基本方法是:链表和数组。

它们都有缺点:在链接列表中,可以轻松地在任何位置添加元素或删除元素。但是,访问特定元素比较困难,因为您必须遍历列表,直到找到所需的元素为止。

  • 它搜索效率不高,但是插入和删除很容易。

使用数组访问特定元素很容易,但是插入或删除元素比较困难,因为插入的方式是:将数组扩展1,将插入位置1之前的所有元素向右移动,然后插入元素。

  • 它搜索效率高(如果已排序),但插入和删除很困难。

因此,链表和数组都有缺点。

二进制树可以解决数组和链表的两个问题:

  1. 轻松插入和删除
  2. 轻松搜寻

因此,当您有大量定期更改的数据时,就会生成二叉树。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.