给定一个二叉搜索树的根节点和要删除的节点的值,使得该节点删除后二叉搜索树性质不变。
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
class Solution
{
public:
void search_delete(TreeNode* &root,int key)
{
if(!root) return;
if(root->val > key) search_delete(root->left,key);
else if(root->val < key) search_delete(root->right,key);
else
{
//三种情况
//1.左右子树都存在
//2.左子树或右子树存在
//3.左右子树都为空
if(root->right)
{
//左右节点都在,用一个节点保存左子树,另一个节点保存右子树
//寻找删除节点相邻的左子树的最右节点或右子树的最左节点
TreeNode *temp1=root->left;
root->left=nullptr;
root=root->right;
TreeNode *temp2=root;
while(temp2->left) temp2=temp->left;
temp2->left=temp1;
}
else if(root->left)
{
root=root->left;
}
else
{
root=nullptr;
}
}
}
TreeNode* deleteNode(TreeNode* root,int key)
{
if(!root) return nullptr;
search_delete(root,key);
return root;
}
};