前
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
remove(root,key);
return root;
}
void remove(TreeNode*& node,int key){
if(node==NULL){
return;
}
else if(key<node->val){
remove(node->left,key);
}
else if(key>node->val){
remove(node->right,key);
}else if(node->left&&node->right){
//上面是常见的递归删除逻辑,目的是寻找到需要删除的节点node
//这里是去右子树里面找到右子树里面最小的节点N2,替代待删除节点node,然后递归删除右子树里面的N2
node->val=find_min(node->right)->val;
remove(node->right,node->val);
}else{
//如果只有1个子树的情况,则利用指针引用的编程优势,直接判断待删除节点的哪个节点不为NULL,直接让待删除节点引用指向其子树
//这里必须理解指针引用的作用,传入的是左值,修改引用指向的指针,等于在其父节点的儿子节点直接修改其指针指向!
TreeNode* tmp=node;
node=(node->left)?node->left:node->right;
delete tmp;
}
}
TreeNode* find_min(TreeNode*& root){
if(!root){
return nullptr;
}
TreeNode* iter=root;
while(iter->left){
iter=iter->left;
}
return iter;
}
};