我正在尝试编写一个删除BST中节点的函数。虽然删除工作正常,但删除节点后我按顺序遍历,我仍然看到删除的节点值为0.我原本希望看不到节点。
例如,当删除节点18时,16被复制到18,而值为16的节点被删除。
[8 10 12 15 16 18 20 25 50]
[8 10 12 15 0 16 20 25 50]
[8 10 12 15 16 20 25 50]
以下是代码段:
bool deleteNode(Node *root,int key) {
if(root) {
if(key < root->data)
return deleteNode(root->left,key);
else if(key > root->data)
return deleteNode(root->right,key);
else if(!root->left && !root->right) {
free(root);
return true;
} else if(root->left && !root->right) {
Node *inorderPre=maxElement(root->left);
root->data=inorderPre->data;
return deleteNode(inorderPre,root->data);
} else {
Node* inorderSucc=minElement(root->right);
root->data=inorderSucc->data;
return deleteNode(inorderSucc,root->data);
}
}
return false;
}
辅助功能:
Node* minElement(Node *root) {
while(root->left!=NULL) {
root=root->left;
}
return root;
}
Node* maxElement(Node *root) {
while(root->right!=NULL) {
root=root->right;
}
return root;
}