【问题标题】:Using pointers in an ABB (C++)在 ABB (C++) 中使用指针
【发布时间】:2020-11-16 04:25:46
【问题描述】:

我一直在研究二叉搜索树。我创建了这个函数来删除节点,但是在删除叶节点(例如,最大)值时发现了一个错误。错误是当我打印树并删除了一些叶节点时,我打印了一些空值。 这是删除值的功能:

void deleteValues(Nodo* p, int valor){
    bool bo;
    Nodo* otro = nullptr;
    Nodo* aux = nullptr;
    Nodo* aux1 = nullptr;
    if(p != nullptr){ 
        if(valor < p->info){ 
            deleteValues(p->izq, valor);
        }
        else{
            if(valor > p->info){
                deleteValues(p->der, valor);
            }
            else{
                otro = p;
                if(otro->der == nullptr){
                    p = otro->izq;
                }
                else{
                    if(otro->izq == nullptr){
                        p = otro->der;
                    }
                    else{
                        aux = p->izq;
                        bo = false;
                        while(aux->der != nullptr){
                            aux1 = aux;
                            aux = aux->der;
                            bo = true;
                        }
                        p->info = aux->info;
                        otro = aux;
                        if(bo){
                            aux1->der = aux->izq;
                        }
                        else{
                            p->izq = aux->izq;
                        }
                    }
                }
                delete(otro);
            }
        }
    }
    else{
        cout << "Not found" << endl;
    }
}

这是按顺序打印值的函数:

void inorder(Nodo *p){ 
    if(p != nullptr){
        if(p->izq != nullptr){
            inorder(p->izq);   
        }
        cout << "[" << p->info << " "<< &p->info << "]"<<endl; 
        if(p->der != nullptr){
            inorder(p->der);
        }
    }
}

输出看起来像这样: 删除前 7:
[1 0x5582468b7730]
[2 0x5582468b76d0]
[4 0x5582468b7710]
[6 0x5582468b7750]
[7 0x5582468b7770]

删除7后:
[1 0x5582468b7730]
[2 0x5582468b76d0]
[4 0x5582468b7710]
[6 0x5582468b7750]
[2 0x5582468a5010]
[1183545072 0x5582468b7770]

我认为使用指针可能是一个错误,但我不确定。 输出是这样的:

感谢您的帮助:)

【问题讨论】:

  • 您删除了一个节点,但不更新从其父节点指向该节点的指针。父级最终得到一个悬空指针。然后inorder 跟随这个指针,该指针曾经指向一个有效节点,但现在不再如此,因此您的程序表现出未定义的行为。

标签: c++ pointers tree binary-tree


【解决方案1】:

您的代码中的问题是,在删除节点后,您并没有更新其父节点中的指针。例如,假设 p 是一棵只有一个节点的树。 (即根节点是叶节点)当您将Node *p 传递给DeleteValues 时,它会删除该节点的内容。但是您的树根指向某个已删除内存的地址,而不是指向 nullptr。您可以通过将双指针作为节点传递来解决此问题。考虑使用原型void DeleteValues(Node **dp, int valor);。在其实现中,在delete(*dp); 之后更新*dp = nullptr;。我只是在基本案例的帮助下指出了错误;您需要处理所有情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 2022-11-14
    • 2018-04-22
    • 2011-05-18
    • 2011-01-11
    • 2014-12-21
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多