二叉树搜索删除节点复杂性

时间:2016-06-23 06:20:43

标签: c++ time-complexity complexity-theory

我尝试计算二叉树搜索节点删除的复杂性。我想计算所有3种情况(最差,平均复杂度和最佳)的复杂度更加严格。如何选择数学公式? T(n)=?

    Nod* delete(Nod*& rad, const int& c)
{
    //Nod has:c(information:int),nextSt(left:pointer to Nod),nextDr(right pointer to Nod)
    Nod* aux;
    if (rad == NULL)
        return NULL;
    else
        if (c< rad->c && c != rad->c) {
            rad->nextSt() = delete(rad->nextSt(), c);
            return rad;
        }
        else
            if (c > rad->c) {
                rad->nextDr() = delete(rad->nextDr(), c);
                return rad;
            }
            else
                if (rad->nextSt() != NULL && rad->nextDr() != NULL) {
                    aux = minim(rad->nextDr());
                    rad->setElem(aux->element());
                    rad->nextDr() = delete(rad->nextDr(), rad->c);
                    return rad;
                }
                else {
                    aux = rad;
                    Nod* repl;
                    if (rad->nextSt() == NULL)
                        repl = rad->nextDr();
                    else
                        repl = rad->nextSt();
                    delete rad;
                    return repl;
                }

}

1 个答案:

答案 0 :(得分:0)

二进制搜索树上的删除操作总是花费O(h)时间。其中h是树高。

因此,如果你的树很平衡,它的高度就是log(N)。并且删除操作也会花费O(log(N))时间。这是最好的情况。

当所有节点使用右/左子节点作为下一个节点时,会出现最坏的情况。如果您将已排序的项目(例如1,2,3,4,5)插入树中,则可能会出现这种情况。因此该树的高度为N,删除操作将花费O(N)时间。在这种情况下,二进制搜索树不是更好的链表。

因此平均复杂度介于log(N)和N

之间

有关二元搜索树和复杂性理论的更多信息,请参阅Cormen的算法简介