思路: TreeNode* deleteNode(TreeNode* root, int key) 表示删除值为key的节点,如果root->val > key,说明要去左子树里面删除,把root->left 重新赋值为删除左子数后的新的根节点。同理如果root->val < key,说明要去右子数里面删除,删完后也要把root->right 赋值。
假设此时root->val == key, 如果root是叶子节点或者,root只有一个节点,那么返回叶子节点即可。
如果root既有左儿子,右有右儿子,要找到右儿子最左边的节点,将root的赋为这个值,然后删除这个代替的右儿子最左边的节点。
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root==NULL) return root;
if(root->val>key) root->left = deleteNode(root->left, key);
else if(root->val<key) root->right = deleteNode(root->right, key);
else{
if(root->left==NULL) return root->right;
if(root->right==NULL) return root->left;
TreeNode* minNode = findminNode(root);
root->val = minNode->val;
root->right = deleteNode(root->right, minNode->val);
}
return root;
}
TreeNode* findminNode(TreeNode* root){
TreeNode* p = root->right;
while(p->left) p = p->left;
return p;
}
};