题目
https://leetcode-cn.com/problems/delete-node-in-a-bst/
二叉搜索树中的结点删除实际考虑的情况非常多,下面我们来分析一波
题目分析
代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
// 找值为 key 的结点
TreeNode* parent = nullptr;
TreeNode* cur = root;
while (cur)
{
if (key > cur->val)
{
parent = cur;
cur = cur->right;
}
else if (key < cur->val)
{
parent = cur;
cur = cur->left;
}
else
{
//找到了
//1、左为空
//2、右为空
//3、左右都不为空
//左为空
if (cur->left == nullptr)
{
if (cur == root)
{
root = cur->right;
}
else
{
if (cur == parent->left)
{
parent->left = cur->right;
}
else
{
parent->right = cur->right;
}
}
delete cur;
return root;
}
//右为空
else if (cur->right == nullptr)
{
if (cur == root)
{
root = cur->left;
}
else
{
if (cur == parent->left)
{
parent->left = cur->left;
}
else
{
parent->right = cur->left;
}
}
delete cur;
return root;
}
//左右都不为空
else
{
//要找到cur的右树的最左结点,或者左树的最右结点subMin, 然后替换掉cur,然后把subMin删除掉即可,subMin一定是左为空的情况
TreeNode* parent = cur;
TreeNode* subMin = cur->right;
while(subMin->left)
{
parent = subMin;
subMin = subMin->left;
}
cur->val = subMin->val;
if (subMin == parent->left)
{
parent->left = subMin->right;
}
else
{
parent->right = subMin->right;
}
return root;
}
}
}
return root;
}
};