【发布时间】: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