【问题标题】:Confused on a fundamental operation on trees对树的基本操作感到困惑
【发布时间】:2013-11-04 05:26:36
【问题描述】:

我们如何在二叉树(不是 BST)中插入
我的意思是二叉树没有像 BST 这样的节点的某些属性,因此似乎可以在树中任何地方插入一个键。
然而,通过将密钥放在任何位置,二叉树可能会将其退化为“列表”,从而失去其O(logN) 属性。
我已经看到使用合并方案创建二叉树(示例应用程序是 Huffman Tree),但似乎没有遇到二叉树的插入方法。
我相信这个问题扩展到多路树,因为二叉树将是多路树(2个子节点)的特定示例,对吧?
我错了吗?是否有向二叉树添加新键的特定方法,或者二叉树的应用程序是否如此具体以至于合并操作就足够了,并且不需要插入方法?也许我完全错过了BT的使用应用或概念?

注意:我问的是二叉树。 关于二叉搜索树。


更新:
如果插入可以在任何地方,术语的含义是什么:Full Binary Tree?
这意味着无法通过在任何地方插入来实现的日志属性。 “完全BT”是不是也没有意义的定义?

【问题讨论】:

  • 二叉树可以用于任何事情。元素本身没有自然排序或解释;它只是一棵树,每个节点上有两个子节点,可能为 null,并且通常具有与每个节点关联的值。正如您所指出的,您必须限制在树上执行的操作才能获得任何有用的属性。以特殊方式插入节点可以保证树的深度是有限的,例如,你会得到 O(log N) 的查找。你必须选择你有什么目标,以及你需要在树上使用的算法来实现它们。
  • O(log N) 做什么?一棵无序的树怎么会有一个一致的大 O 呢?组织上没有限制,所以大O有点没有意义,不是吗?
  • @DaveNewton:在这种情况下,为什么不首先使用列表并避免所有树逻辑?否则为什么/何时使用二叉树?
  • @user384706 如果你有一个完全退化的情况,那么我不会使用二叉树,但如果你以前不知道您开始,然后 BT 更通用(而不是过于复杂)。回复:“完整 BT”的含义取决于您正在阅读的内容,但仅仅因为您可以在任何地方插入并不意味着您在任何地方插入。
  • 二叉树非常有用!它们用于数据结构,如集合、多集合、关联数组等。标准库数据结构的负载通常使用二叉树以及更具体的算法(如查找 Huffman 编码)来实现。没有正确处理就没有任何用处:您必须以正确的方式拿着刀才能用它切割东西,并且您必须将元素明智地插入二叉树以获得快速查找。不会阻止它们中的任何一个变得非常有用。

标签: algorithm data-structures tree binary-tree


【解决方案1】:

二叉树是一种特定类型的树,满足每个节点恰好有 0、1 或 2 个子节点的条件。任何满足此条件的树都被标记为二叉树。

因此,没有“正确”的方式将元素插入二叉树。只要之前是二叉树,之后是二叉树,插入就有效。

二叉树这个词更多地用于分类。在其纯粹的“抽象”形式中,它作为数据结构并不是非常有用。但是,在表征其他更具体类型的树(如您提到的 Huffman tree)时,它会很有帮助。

【讨论】:

  • 为了迂腐,二叉树节点可以有 0、1 或 2 个子节点。
  • 对于一个完整的二叉树,每个节点总是有 2 个孩子,除了没有孩子的叶子。
  • @PetarMinchev:但是如果插入可以在任何地方,我们如何才能获得完整的二叉树(这意味着对数属性)?这里的答案是no correct way to insert
【解决方案2】:

最简单的方案可能是如下维护一个完整的树。调用第一个插入的节点 1,第二个 2,第三个 3,依此类推。当您插入节点 i 时,如果 i 是偶数,则使其成为 i/2 的节点的左孩子,如果 i 是奇数,则使其成为 (i-1)/2 的右孩子。例如,您将插入的第五个节点插入到第二个节点的右子节点中。您插入的第六个节点创建到第三个节点的左子节点中。如果您需要删除一个节点,请先与编号最高的节点交换,以便始终从最后删除。

这棵树可以通过从位置 1 开始在数组中布置节点来表示,这对于二叉堆来说很常见。节点 i 的子节点始终为 2i 和 2i+1,除非这些数字大于节点的总数,在这种情况下,您位于树的底部。

【讨论】:

    【解决方案3】:

    这就是所有的意思。在 BST 中,插入由元素的属性(大于、小于等)引导。在一般的 BT 将不得不处理插入过程。

    假设你想使用 BT 来实现无序收集。除了它携带的数据元素之外,只需用两个附加值标记每个节点:左侧的节点数量和右侧的数量。然后让你的插入由这两个引导,达到近乎完美的平衡。对于叶子,最初使用没有子节点的节点,任何新元素在到达时都可以作为子节点插入其中。

    现在你有了一个完美的自动平衡 BT,它实现了一个无序的东西集合,可以在 O(log(n)) 时间内插入,并且可以不按特定顺序列出。这只是一个例子。

    【讨论】:

      猜你喜欢
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      相关资源
      最近更新 更多