繁体   English   中英

公平删除二叉搜索树中的节点

[英]Fair deletion of nodes in Binary Search Tree

在BST中删除节点的想法是:

  1. 如果该节点没有子节点,则将其删除并将该节点的父节点指针更新为null

  2. 如果该节点有一个子节点,则通过更新该节点的父节点指向其子节点的指针,将该节点替换为其子节点

  3. 如果该节点有两个子节点,请找到该节点的前任节点并将其替换为其前任节点,并通过将其指向其唯一的子节点(只能是左子节点)来更新前任节点的父节点的指针。

最后一种情况也可以使用后继而不是前继来完成!

有人说,如果在某些情况下使用前任产品,而在其他情况下使用后继产品(给予它们同等的优先级),我们可以得到更好的经验性能,

现在的问题是,如何完成? 基于什么策略? 以及它如何影响性能? (我猜按性能,它们表示时间复杂度)

我认为,我们必须选择前任或后继才能拥有更加平衡的树! 但是我不知道该如何选择使用哪一个!

一种解决方案是随机选择其中之一(相当的随机性),但是基于树形结构的策略不是更好吗? 但是问题是什么时候选择哪个?

如您所说,这是平衡的问题,因此通常最好选择最小化平衡的方法。 您可以持有一些度量标准来衡量平衡水平(例如,与最大和最小叶高,平均高度的差等),但是我不确定开销是否值得。 此外,还有一些自平衡数据结构(红黑,AVL树等)可通过在每次删除后进行重新平衡来缓解此问题。 如果您想使用基本的BST,我想最好的策略是在没有先验知识的树状结构知识的情况下进行,而删除顺序将是在每次删除的2种方法之间切换。

问题是根本的问题-为BST找到正确的删除算法。 50年来,人们一直在尝试解决它(就像就地合并一样),他们没有找到比通常的算法更好的东西(删除前任/后继)。 那么,经典算法有什么问题呢? 实际上,此删除操作使树不平衡。 经过多次随机操作add/remove ,你会得到不平衡树高度sqrt(n) 不管您选择什么-删除后继者或前任者(或通过这些方式随机选择beetwen)-结果是相同的。

那么,该选择什么呢? 我猜基于随机(成功或掠夺)的删除将推迟您的树的不平衡。 但是,如果您想拥有完美平衡的树,则必须使用红黑树或类似的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM