对树木的基本操作感到困惑

时间:2012-05-27 15:40:55

标签: algorithm data-structures tree binary-tree

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

注意:我在询问二叉树。关于二进制搜索树的


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

3 个答案:

答案 0 :(得分:2)

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

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

术语二叉树更多用于分类而不是任何东西。在它的纯粹"抽象"形式,它作为数据结构并不十分有用。但是,在描述其他更具体类型的树时,例如您提到的Huffman tree,它会很有用。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这就是所有这些意味着什么。在BST中,插入由元素的属性(大于,小于等)引导。在一般的BT 中,您必须处理插入过程。

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

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