为什么二元树很重要?

时间:2009-12-05 13:00:10

标签: data-structures tree

为什么我们要专门研究二叉树?正如在一般的m-way搜索树中,没有像DataStructure教科书中的二叉树那样重要。

二叉树的使用是否超过m-way树?

7 个答案:

答案 0 :(得分:28)

二叉树是多路树的最简单形式,因此在这种意义上它们更容易学习。

多路树的节点由N个键和N+1个指针组成,分别为:

               |
   +-----+-----+-----+-----+
   | k00 | k01 | k02 | k03 |
   +-----+-----+-----+-----+
  /      |     |     |      \
p00     p01   p02   p03     p04

要找出在搜索中要遵循的指针,请将要查找的键与节点中的键进行比较。上面的示例是一个order-2多路树(我将订单n定义为具有2n个密钥和2n+1指针)。

当你“退化”这个结构以使最小的节点成为可能时,你最终得到一个键和两个指针,你的经典二叉树:

      |
   +-----+
   | k00 |
   +-----+
  /       \
p00       p01

当我上大学时(我会很快承认它已经很久了),我们首先研究了二元树 ,因为算法很优雅。搜索是一个简单的比较节点,并选择两个子树之一。插入和删除也相对容易。

然后我们继续平衡二叉树,其中搜索完全相同但插入和删除稍微复杂一些,涉及通过子树根“旋转”子树必须保持平衡。

然后是非平衡的多路树,一旦你找到了正确的节点就得到了在节点内搜索的概念,最后,平衡的多路树基本上与二叉树相同但是同样增加了顺序搜索的复杂性,以及节点内的插入或删除以及节点本身的组合和吐出。

在每个步骤中,您只需为算法添加一点复杂性。我不记得有太多人因为这个进展而遇到麻烦,所以你提到的所有教科书都只是处于初级阶段。

除非在一个非常具体的情况下,我从未真正发现多路树比二叉树更有用。那是当你从像磁盘这样的慢速介质中读取树的节点时,你已经针对扇区/集群/块大小进行了优化。

我们开发了OS / 2下的多路树实现(显示我的年龄),它通过确保节点大小与底层磁盘块相同而尖叫。即使这可能会导致一些浪费的空间,速度的提升也是值得的。

对于内存中的东西,二叉树具有多路的所有优点,没有任何额外的复杂性(必须将节点的顺序搜索与子树选择相结合)。

二叉树归结为“我们应该向左还是向右移动?”,多方式是“这个节点中的关键在哪里,以便我们可以选择子树?”。

答案 1 :(得分:5)

二叉树是一个简单的概念,它们易于理解,易于实现,并且运行良好且快速 - 我认为这足以用于教学和/或使用它们。

答案 2 :(得分:1)

二元树优于“n-ary”树的一个优点是遍历它们通常归结为一个简单的是/否决策问题,如binary space partitioning

答案 3 :(得分:1)

因为树数据结构经常用于组织有序元素,例如:a> b> C。如果您在树中插入的项目是有序的,则您需要的是每个节点上的两个分支,以将较大的元素划分为左子树,将较小的元素划分到右子树中。

这就是为什么二元树比m-ary树更普遍的原因。它与做出是/否决定的简易性无关,而与多元决策无关!

答案 4 :(得分:1)

添加上面的所有答案,任何arity的树都可以用二叉树表示(其中左链接转到节点的第一个子节点,右链接转到下一个“兄弟”)。

答案 5 :(得分:-1)

我不会在这里做太多技术..因为问题是为什么二元树在DataStructure中如此重要。二叉树,意思是基于T / F的树,是/否等。意思是说Duo的组合。实际上我们面临的情况是我们需要决定是或否。无论是对还是对。二叉树代表了这种情况。我们所使用的软件是将使用内部用于解决现实生活场景的数据结构的解决方案。这就是为什么二进制树进入图像并且常用甚至是重要的原因。其余的树木是进一步的改进或增加的复杂性,以匹配它们与典型的情况。对于启动二叉树总是很重要。

答案 6 :(得分:-2)

例如,二叉树用于堆排序(二进制堆)。这是非常快速排序数据的方式,因此最大(或最低)的项目始终位于前端。这用于例如AI(A *算法)。