我很難找出爲什麼我的樹的刪除功能「有點」刪除節點。當我打印結果時,「已刪除」節點顯示爲零。二元搜索樹刪除函數設置節點爲零而不是刪除
例如: 添加節點7,3,9,然後刪除節點9
輸入: 添加7,3,9 刪除3
輸出:0,7,9
void Tree::remove(int val) {
Node* temp;
if (root == nullptr)
{return;}
if (val == root->val)
{
if (root->left == nullptr && root->right == nullptr){ //leaf node
delete root;
}
else{
temp = root;
if (root->left != nullptr && root->right != nullptr){ //left and right children exist
if (root->left->val - val <= root->right->val - val){//left child is closer to value than right
int val_to_save = root->left->val;
root = root->left;
remove(val_to_save);
temp->val = val_to_save;//replace value with deleted node
root = temp;}
else{
int val_to_save = root->right->val;
root = root->right;
std::cout << val_to_save << std::endl;
remove(val_to_save);
temp->val = val_to_save;//replace value with deleted node
root = temp;}
}
else{ // only one child, either left or right
if(root->left != nullptr){ //left child
temp->left = root->left;
delete temp;}
else{ //right child
temp->right = root->right;
delete temp;}
}
}
}
else{ //value does not match
temp = root;
if (val < root->val)
{
temp = temp->left;
remove(val);
root = temp;
}
else{
root = root->right;
remove(val);
root = temp;}
}
}
*我無法弄清楚爲什麼我的樹的刪除功能是「有點」刪除節點。* - 使用編譯器工具集隨附的調試程序,並查看您寫入的代碼在哪裏發散從你預期發生的事情。 – PaulMcKenzie
當您刪除葉子時,請確保其父級的子級指針設置爲nullptr。也就是說,我認爲你還遠離實現正確的實施。 –
是的,我在如何跟蹤當前節點及其子節點時遇到問題 – user6313136