题目描述
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
代码
/*
1.没找到删除的节点:返回节点
2.叶子节点:直接删除
3.左不空右空:直接使用左孩子替换
4.左空右不空:直接使用右孩子替换
5.左右都不空:将左孩子放到右孩子的最左侧的节点,然后将右孩子替换要删除的节点
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if (root == nullptr) return nullptr;
if (root->val == key) {
//叶子节点
if (root->left == nullptr && root->right == nullptr)
{
//释放内存
delete root;
return nullptr;
}
//左不空右空
else if (root->left) {
TreeNode* retNode = root->left;
//释放内存
delete root;
return retNode;
}
//左空右不空
else if (root->right) {
TreeNode* retNode = root->right;
delete root;
return retNode;
}
//左右都不空
else if (root->left && root->right) {
TreeNode* cur = root->right;
while (cur->left) cur = cur->left;
cur->left = root->left;
TreeNode* tmp = root;
root = root->right;
delete tmp;
return root;
}
}
else if (key < root->val) root->left = deleteNode(root->left, key);
else if (key > root->val) root->right = deleteNode(root->right, key);
return root;
}
};