Leetcode 450. 删除二叉搜索树中的节点
题目
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
思路
- 确定递归函数的参数和返回值:根节点,目标值。
- 确定终止条件:遇到空结点就返回,说明没找到删除的节点,遍历到空结点之后就直接返回了
- 找到了删除的节点:
- 左右孩子都是空 叶子节点 ,直接删除即可
- 被删除节点的左孩子是空,右孩子不为空,直接删除该节点,右孩子作为新的根节点
- 被删除节点的右孩子是空,左孩子不为空,直接删除该节点,左孩子作为新的根节点
- 被删除节点的左右孩子都不为空,将被删除节点的左子树连接到被删除节点的右子树中的最左节点下,被删除节点的右子树顶替根节点
代码
/**
* 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) {
if(root == nullptr)
{
return nullptr;
}
if(key > root->val)
{
// 当前节点值小于目标值 在右子树中寻找
root->right = deleteNode(root->right,key);
}
else if(key < root->val)
{
// 当前节点值大于 目标值
root->left= deleteNode(root->left,key);
}
else
{
// 找到目标节点值
if(root->left == nullptr)
{
return root->right;
}
if(root->right == nullptr)
{
return root->left;
}
// 删除的节点 左右子树都存在
// 寻找删除节点右子树中的最左节点
TreeNode* node = root->right;
while(node->left != nullptr)
{
node = node->left;
}
// 将被删除节点的左子树连接到 上述寻找到的最左节点
node->left = root->left;
// 被删除的节点的右子顶替为位置 节点被删除
root = root->right;
}
return root;
}
};