1

我们如何在二叉树(不是BST)中插入一个键? 我的意思是二叉树没有像 BST 这样的节点的某些属性,所以似乎键的插入可以在树中的任何位置。 然而,通过将密钥放在任何地方,二叉树可能会将其退化为失去其属性的“列表”。 我已经看到使用合并方案创建二叉树(示例应用程序是 a ),但似乎没有遇到二叉树的插入方法。 我相信这个问题扩展到多路树,因为二叉树将是多路树(2个子节点)的特定示例,对吧?

O(logN)
Huffman Tree

我错了吗?是否有向二叉树添加新键的特定方法,或者二叉树的应用程序是否如此具体以至于合并操作就足够了并且不需要插入方法?也许我完全错过了BT的使用应用或概念?

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


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

4

3 回答 3

2

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

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

术语二叉树比任何东西都更适合分类。在其纯粹的“抽象”形式中,它作为数据结构并不是非常有用。但是,在表征其他更具体类型的树(如您提到的霍夫曼树)时,它会很有帮助。

于 2012-05-27T15:48:49.043 回答
0

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

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

于 2012-05-28T09:18:26.500 回答
0

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

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

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

于 2012-05-29T16:44:46.140 回答