题目描述
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
题解
删除二叉树的节点, 如果root为空,直接return nullptr:
否则,如果root->val=key,那么分为四种情况:
- root->left=null&&root->right=null,此时直接另root=null
- root->left!=null&&root->right=null,此时return root->right
- root->left=null&&root->right!=null,此时return root->left
- root->left!=null&&root->right!=null,此时就另root的左子树作为右子树的最左下节点的左子树,然后return root->right,或者另root的右子树作为左子树的最右下节点的右子树,然后return root->left
如果root->val< key:那么被删除节点肯定在右子树,所以root->right=deleteNode(root->right,key)
如果root->val>key:那么被删除节点肯定在左子树,所以root->left=deleteNode(root->left,key)
代码
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(!root) return nullptr;
if(root->val==key){
if(!root->left&&!root->right)
root=nullptr;
else if(root->left&&!root->right)
return root->left;
else if(!root->left&&root->right)
return root->right;
else{
TreeNode *p=root->left;
TreeNode *q=root->right;
while(q->left)
q=q->left;
q->left=p;
return root->right;
}
}else if(root->val<key)
root->right=deleteNode(root->right,key);
else
root->left=deleteNode(root->left,key);
return root;
}
};
题目链接(https://leetcode-cn.com/problems/delete-node-in-a-bst/)