【LeetCode 46】450.删除二叉搜索树的节点

简介: 【LeetCode 46】450.删除二叉搜索树的节点

一、题意

二、解答过程

二叉搜索树的删除要比插入困难,复杂。同样需要递归!

二叉搜索树删除情况有五种:

  • 没找到删除的节点,遍历到空节点直接返回了
  • 找到删除的节点
  • 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
  • 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
  • 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
  • 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        //情况一:没有找到删除的节点,遍历到空节点直接返回
        if(root==NULL) return root;
        if(root->val==key)
        {
            //情况二:左右孩子都为空(叶子节点),直接删除节点,返回NULL为根节点
            //情况三:其左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
            if(root->left==NULL) return root->right;
            //情况四:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
            else if(root->right==NULL) return root->left;
            /*
            情况五:左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右子树
            树的最左面节点的左孩子的位置
            返回删除节点右孩子为新的根节点
            */
           else
           {
               TreeNode *tmp=root->right;
               while(tmp&&tmp->left)
               {
                   tmp=tmp->left;
               }
               swap(root->val,tmp->val);
                root->right=deleteNode(root->right,key);
           }
        }
        //被删除的节点key值在左子树,去左子树找就可以了(key值是我们要找的)
        if(root->val>key)
        {
            root->left=deleteNode(root->left,key);
        }
        //被删除的节点key值在右子树,去右子树找就可以
        if(root->val<key)
        {
            root->right=deleteNode(root->right,key);
        
        }
        return root;
    }
};


目录
相关文章
|
2月前
【LeetCode 45】701.二叉搜索树中的插入操作
【LeetCode 45】701.二叉搜索树中的插入操作
10 1
|
2月前
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先
19 1
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
22 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
41 0
|
2月前
【LeetCode 47】669.修剪二叉搜索树
【LeetCode 47】669.修剪二叉搜索树
10 0
|
2月前
【LeetCode 42】501.二叉搜索树中的众数
【LeetCode 42】501.二叉搜索树中的众数
10 0
|
2月前
【LeetCode 41】530.二叉搜索树的最小绝对差
【LeetCode 41】530.二叉搜索树的最小绝对差
11 0
|
2月前
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树
14 0
|
2月前
【LeetCode 39】700.二叉搜索树中的搜索
【LeetCode 39】700.二叉搜索树中的搜索
16 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行