[英]Remove Node from Binary Search Tree Iteratively
已經為此工作了一段時間。 在有兩個子節點的情況下存在分段錯誤。 我不知道如何解決這個問題。 我很確定其他情況是正確的,但我目前正在努力解決要刪除的節點有 2 個子節點的情況。
bool BinarySearchTree::remove(BinarySearchTree::TaskItem val) {
if(!exists(val))
return false;
else{
TaskItem* cur = root;
TaskItem* parent = nullptr;
if(size == 1){ // only one node in tree
delete cur;
root = nullptr;
size--;
return true;
}
else if(*cur == val && (!cur->right || !cur->left)){// root node is target, with one child node
if(!cur->right){
root = cur->left;
delete cur;
}
else{
root = cur->right;
delete cur;
}
size--;
return true;
}
while(!(*cur==val)){
if(val.priority < cur->priority){
parent = cur;
cur = cur->left;
}
else{
parent = cur;
cur = cur->right;
}
}
if(!cur->right && !cur->left){ // no child nodes
if(parent->right == cur){
parent->right = nullptr;
delete cur;
}
else{
parent->left = nullptr;
delete cur;
}
}
else if(cur->right && cur->left){ // 2 child nodes
TaskItem* success = cur->right;
TaskItem* par_success = cur;
while(!success->left){
par_success = success;
success = success->left;
}
cur->priority = success->priority;
cur->description = success->description;
if(par_success->left == success){
par_success->left = nullptr;
}
else{
par_success->right = nullptr;
}
delete success;
}
else{// one child node
if(!cur->right){ // child node on the left
if(parent->right == cur){
parent->right = cur->left;
delete cur;
}
else{
parent->left = cur->left;
delete cur;
}
}
if(!cur->left){
if(parent->right == cur){
parent->right = cur->right;
delete cur;
}
else{
parent->left = cur->right;
delete cur;
}
}
}
size--;
return true;
}
}
您正在取消引用指針而不檢查null
:
while(!(*cur==val)){
if(val.priority < cur->priority){
parent = cur;
cur = cur->left;
}
else{
parent = cur;
cur = cur->right;
}
}
如果cur->left
或cur->right
是null
(我想它們是指針)在*cur
中訪問它們將出現段錯誤。
在這:
else if(cur->right && cur->left){ // 2 child nodes
TaskItem* success = cur->right;
TaskItem* par_success = cur;
while(!success->left){
par_success = success;
success = success->left;
}
您正在直接訪問null
指針。 如果cur->right->left
(success- success->left
) 是null
,您將在以下迭代中訪問null
指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.