Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二叉树搜索删除节点复杂性_C++_Time Complexity_Complexity Theory - Fatal编程技术网

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

C++ 二叉树搜索删除节点复杂性,c++,time-complexity,complexity-theory,C++,Time Complexity,Complexity Theory,我试图计算二叉树搜索节点删除的复杂度。我想计算所有3种情况下(最差、平均复杂度和最佳)的复杂度。如何选择数学公式?T(n)= Nod*删除(Nod*&rad,const int&c) { //Nod有:c(信息:int)、nextSt(左:指向Nod的指针)、nextDr(右指向Nod的指针) Nod*aux; 如果(rad==NULL) 返回NULL; 其他的 如果(cc&&c!=rad->c){ rad->nextSt()=删除(rad->nextSt(),c); 返回rad; } 其他的

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

Nod*删除(Nod*&rad,const int&c)
{
//Nod有:c(信息:int)、nextSt(左:指向Nod的指针)、nextDr(右指向Nod的指针)
Nod*aux;
如果(rad==NULL)
返回NULL;
其他的
如果(cc&&c!=rad->c){
rad->nextSt()=删除(rad->nextSt(),c);
返回rad;
}
其他的
如果(c>rad->c){
rad->nextDr()=删除(rad->nextDr(),c);
返回rad;
}
其他的
如果(rad->nextSt()!=NULL&&rad->nextDr()!=NULL){
aux=最小值(rad->nextDr());
rad->setElem(辅助->元素());
rad->nextDr()=删除(rad->nextDr(),rad->c);
返回rad;
}
否则{
aux=rad;
Nod*repl;
如果(rad->nextSt()==NULL)
repl=rad->nextDr();
其他的
repl=rad->nextSt();
删除rad;
返回repl;
}
}

对二元搜索树的删除操作始终需要O(h)个时间。其中h是树的高度

所以,如果你的树很平衡,它的高度是log(N)。删除操作也需要O(log(N))时间。这是最好的例子

当所有节点都使用右/左子节点作为下一个节点时,会出现最坏的情况。如果将排序项目(例如1、2、3、4、5)插入到树中,则可能会出现这种情况。所以这棵树的高度是N,移除操作需要O(N)个时间。在这种情况下,二叉搜索树不是更好的链表

所以平均复杂度介于log(N)和N之间


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

,这取决于节点是否平衡。节点删除在二叉树中是O(深度)。O(depth)=O(n)表示不平衡树(n表示节点计数),而O(log(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;
                }

}