分析
数据结构上的问题,我们需要找到删除节点的前一个节点、或者后一个节点来替换删除节点。
前一个节点按照BST(binary sorted tree)性质为左子树最右侧节点。
后一个节点为右子树最左侧节点。
我们直接使用值覆盖的方式替换,替换完成后,我们需要删除替换节点。
替换节点有一性质,他必定是单支树,所以我们只用将其子树(左子树、右子树)链接至父节点就可以了。
代码
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
TreeNode *p{root}, *pre;
while(p != NULL && p->val != key){
pre = p;
if(p->val < key)
p = p->right;
else
p = p->left;
}
if(p == NULL)
return root;
if(p->left == NULL){
if(p == root)
root = root->right;
else{
if(pre->left == p)
pre->left = p->right;
else
pre->right = p->right;
}
delete p;
}
else{
TreeNode *minp = p->left;
pre = minp;
while(minp->right != NULL){
pre = minp;
minp = minp->right;
}
if(minp == pre){
p->val = minp->val;
p->left = minp->left;
}else{
p->val = minp->val;
pre->right = minp->left;
}
delete minp;
}
return root;
}
};