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

Algorithm 二叉搜索树中节点的公平删除,algorithm,data-structures,binary-search-tree,Algorithm,Data Structures,Binary Search Tree,在BST中删除节点的想法是: 如果该节点没有子节点,请将其删除并将指向该节点的父节点指针更新为null 如果节点有一个子节点,则通过更新节点的父节点指向其子节点的指针,将节点替换为其子节点 如果节点有两个子节点,请查找节点的前置节点并将其替换为其前置节点,还可以通过将前置节点的父节点指针指向其唯一的子节点(只能是左子节点)来更新前置节点的父节点指针 最后一种情况也可以通过使用继任者而不是前任来完成 有人说,如果我们在某些情况下使用前任,在其他一些情况下使用继任者(给予他们同等的优先权),我们可以

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

  • 如果该节点没有子节点,请将其删除并将指向该节点的父节点指针更新为null

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

  • 如果节点有两个子节点,请查找节点的前置节点并将其替换为其前置节点,还可以通过将前置节点的父节点指针指向其唯一的子节点(只能是左子节点)来更新前置节点的父节点指针

  • 最后一种情况也可以通过使用继任者而不是前任来完成

    有人说,如果我们在某些情况下使用前任,在其他一些情况下使用继任者(给予他们同等的优先权),我们可以获得更好的实证绩效

    现在的问题是,这是如何做到的?基于什么策略?它如何影响性能?(我猜性能指的是时间复杂度)

    我想的是,我们必须选择前任或继任者来拥有一棵更平衡的树!但我不知道如何选择使用哪一个


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

    正如你所说,这是一个平衡的问题,所以一般来说,干扰平衡最小的方法更可取。您可以保留一些度量标准来衡量平衡水平(例如,最大和最小叶高的差异、平均高度等),但我不确定开销是否值得。此外,还有自平衡数据结构(红黑、AVL树等),通过在每次删除后重新平衡来缓解此问题。如果你想使用基本的BST,我想在没有树结构和删除序列先验知识的情况下,最好的策略是在每次删除的两种方法之间切换

    问题是,这是一个基本问题——为BST找到正确的删除算法。50年来,人们一直在试图解决它(就像就地合并),但他们没有找到比普通算法更好的算法(使用前/后删除)。那么,经典算法有什么问题?事实上,这会使树失去平衡。经过几次随机操作
    add/remove
    ,您将得到高度为
    sqrt(n)
    的不平衡树。不管你选择了什么——删除继任者或前任(或随机选择这些方式)——结果都是一样的


    那么,选择什么呢?我猜基于随机(succ或pred)的删除将推迟树的不平衡。但是,如果你想拥有一棵完美平衡的树,你必须使用红黑树或类似的东西。

    你如何获得
    sqrt(n)
    ?看到证据很有趣,我以为我们达到了O(n)的高度!我不明白为什么删除前一个比删除后一个更快?我们知道,如果一个节点有一个左子节点,那么前置子节点将是树的最右边的子节点,根在这个右子节点上(当我们到达我们正在寻找其前置子节点的节点时,我们没有访问过它),如果它没有左子节点,我们将在树中向上移动,直到到达右边缘!(我们在寻找继任者时的做法与我们在寻找继任者时的做法相同)那么,继任者和前任在时间复杂性方面有什么区别?甚至常数?嗯,你是对的-不知道我在想什么。将删除该部分