例题
1.确定参数及返回值
2.确定终止条件
若找到了与key值匹配的结点,我们对其进行删除操作,若该结点没有子树,则删除后只剩NULL,返回NULL即可;若该结点只有一颗子树(左or右),删除此结点只剩其子树,返回其子树即可;若该结点的两颗子树都存在,处理比较复杂;首先要将两颗子树合并为一颗并返回,此时可以将左子树挂在右子树的最左边,或将右子树挂在左子树的最右边,再返回整合后的子树。
3.确定单层递归的逻辑
在单层递归中,若当前结点的值符合key值,按照终止条件处理;若不符合key值,根据BST的特点,继续去左子树或者右子树中寻找删除结点,并在本层使用root->left或者root->right来接住下一层返回的子树。
code:
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root == nullptr)
return root;
if(root->val == key)//当前结点值为key时,对应的五种情况
{
if(!root->left && !root->right)
return nullptr;
else if(root->left && !root->right)
return root->left;
else if(!root->left && root->right)
return root->right;
else
{
TreeNode* p=root->right;
while(p->left != NULL)
p=p->left;
p->left=root->left;
return root->right;
}
}
//递归开始
if(root->val > key)
root->left = deleteNode(root->left,key);
if(root->val < key)
root->right = deleteNode(root->right,key);
return root;
}
};