在BST中删除节点的想法是:
如果节点没有子节点,请将其删除并将父节点指向此节点的指针更新为null
如果节点有一个子节点,请通过更新节点的父节点指向其子节点的指针将节点替换为子节点
如果节点有两个子节点,找到该节点的前任并将其替换为其前一个节点,也可以通过将其指向其唯一的子节点(只能是左子节点)来更新前一节点的父指针。 p>
最后一种情况也可以使用后继而不是前任来完成!
据说如果我们在某些情况下使用前任,在其他情况下使用后继(给予它们相同的优先权),我们可以有更好的经验表现,
现在的问题是,它是如何完成的?根据什么策略?它如何影响性能? (我猜他们的表现就意味着时间的复杂性)
我认为我们必须选择前任或后继才能拥有更加平衡的树!但我不知道如何选择使用哪一个!
一种解决方案是随机选择其中一种(公平随机性),但是根据树结构制定策略并不是更好吗?但问题是什么时候选择什么?
答案 0 :(得分:0)
如你所说,这是一个平衡问题,因此一般来说,扰乱平衡的方法最少是可取的。您可以保留一些指标来衡量平衡水平(例如,与最大和最小叶高,平均高度等的差异),但我不确定开销是否值得。此外,还有自平衡数据结构(红黑,AVL树等),可通过每次删除后重新平衡来缓解此问题。如果你想使用基本的BST,我认为没有对树结构和删除序列的先验知识的最佳策略是在每个删除的两种方法之间切换。
答案 1 :(得分:0)
问题是基本问题 - 为BST找到正确的删除算法。 50年来,人们一直试图解决它(就像就地合并一样),他们没有找到比通常的算法更好的东西(前身/后继删除)。那么,经典算法有什么问题呢?实际上,这种去除会使树失去平衡。经过几次随机操作add/remove
后,您将获得高度为sqrt(n)
的不平衡树。而且无论你选择什么 - 删除继任者或前任(或随机选择beetwen这些方式) - 结果都是一样的。
那么,选择什么?我猜测基于随机(succ或pred)的删除会推迟你的树的不平衡。但是,如果你想拥有完美平衡的树 - 你必须使用红黑色或类似的东西。