代码随想录训练营第二十二天|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先

题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/comments/

方法一:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == NULL || root == p || root ==  q)
            return root;
        TreeNode* left = lowestCommonAncestor(root->left,p,q);
        TreeNode* right = lowestCommonAncestor(root->right,p,q);
        if(left&&right)
            return root;
        if(left)
            return left;
        if(right)
            return right;
        return NULL;
    }
};

这个跟昨天的那道题一样,但是那道题是普通二叉树,这个是搜索二叉树,所以有新的方法:

递归:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root->val < p->val && root->val < q->val)
            return lowestCommonAncestor(root->right,p,q);
        else if(root->val > p->val && root->val > q->val)
            return lowestCommonAncestor(root->left,p,q);
        else return root;
    }
};

迭代:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        while(root)
        {
            if(root->val < p->val && root->val < q->val)
                root = root->right;
            else if(root->val > p->val && root->val > q->val)
                root = root->left;
            else return root;
        }
        return NULL;
    }
};

701.二叉搜索树中的插入操作

题目链接:https://leetcode.cn/problems/insert-into-a-binary-search-tree/submissions/

代码(迭代):

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        TreeNode* cur = new TreeNode(0);
        if(root == nullptr)
        {
            cur->val = val;
            return cur;
        }
        cur = root;
        TreeNode* pre = nullptr;
        while(cur)
        {
            if(cur->val < val)
            {
                pre = cur;
                cur = cur->right;
            }
            else if(cur->val > val)
            {
                pre = cur;
                cur = cur->left;
            }
        }
        TreeNode* tmp = new TreeNode(0);
        if(pre->val < val)
        {
            tmp->val = val;
            pre->right = tmp;
        }else{
            tmp->val = val;
            pre->left = tmp;
        }
        return root;
    }
};

代码(递归):

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root == nullptr)
        {
            TreeNode* cur = new TreeNode(val);
            return cur;
        }
        if(root->val > val)
            root->left = insertIntoBST(root->left,val);
        else
            root->right = insertIntoBST(root->right,val);
        return root;
    }
};

这个更简单 但是我总是想不到

450.删除二叉搜索树中的节点

题目链接:https://leetcode.cn/problems/delete-node-in-a-bst/submissions/

有五种情况:

  • 第一种情况:没找到删除的节点,遍历到空节点直接返回了

  • 找到删除的节点

  • 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点

  • 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点

  • 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点

  • 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

方法一(暴力解法):

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root == nullptr)
            return nullptr;
        TreeNode* cur = root;
        TreeNode* pre = nullptr;
        while(cur)
        {
            if(cur->val > key)
            {
                pre = cur;
                cur = cur->left;
            }else if(cur->val < key)
            {
                pre = cur;
                cur = cur->right;
            }else break;
        }
        if(cur && cur->val == key)
        {
            if(!cur->left && !cur->right)
            {
                if(cur == root)
                    return nullptr;
                else
                {
                    if(pre->left == cur)
                        pre->left = nullptr;
                    else
                        pre->right = nullptr;
                }
                    delete cur;
            }else if(cur->left && !cur->right)
            {
                TreeNode* tmp = cur;
                if(pre && pre->left == cur)
                    pre->left = cur->left;
                else if(pre && pre->right == cur)
                    pre->right = cur->left;
                else return cur->left;
                delete tmp;
            }else if(!cur->left && cur->right)
            {
                TreeNode* tmp = cur;
                if(pre && pre->left == cur)
                    pre->left = cur->right;
                else if(pre && pre->right == cur)
                    pre->right = cur->right;
                else return cur->right;
                delete tmp;
            }else
            {
                TreeNode* tmp = cur;
                TreeNode* tmp_right = cur->right;
                TreeNode* tmp_back = tmp_right;
                while(tmp_right->left)
                    tmp_right = tmp_right->left;
                tmp_right->left = cur->left;
                if(pre && pre->left == cur)
                    pre->left = tmp_back;
                else if(pre && pre->right == cur)
                    pre->right = tmp_back;
                else
                    return tmp_back;
                delete tmp;
            }
        }
        return root;
    }
};

就是找到该删除的点 然后替换 很麻烦 用递归更容易些:

方法二(递归):

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root == nullptr)
            return root;
        if(root->val == key)
        {
            if(!root->left && !root->right)
            {
                delete root;
                return nullptr;
            }else if(!root->left && root->right)
            {
                auto renode = root->right;
                delete root;
                return renode;
            }else if(!root->right && root->left)
            {
                auto renode = root->left;
                delete root;
                return renode;
            }else{
                TreeNode* tmp = root->right;
                while(tmp->left)
                    tmp = tmp->left;
                tmp->left = root->left;
                TreeNode* del = root;
                root = root->right;
                delete del;
                return root;
            }
        }
        if(root->val > key)
            root->left = deleteNode(root->left,key);
        else
            root->right = deleteNode(root->right,key);
        return root;
    }
};

这个更简便一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值