训练营打卡Day22

训练营打卡Day22

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

思路

  1. 如果当前结点root为空或者p或q等于root,那么返回root。
  2. 如果p的值小于等于root的值且root的值小于等于q的值,或者q的值小于等于root的值且root的值小于等于p的值,那么返回root。
  3. 如果p的值大于root的值,则递归root的右子树,并返回递归的结果。
  4. 否则,递归root的左子树,并返回递归的结果。

代码

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

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

思路

  1. 如果当前节点为空,则新建一个节点并将其值设为给定值,并返回该节点
  2. 如果当前节点的值大于给定值,则在当前节点的左子树中递归调用这个函数,并将返回值赋给当前节点的左子节点。
  3. 如果当前节点的值小于给定值,则在当前节点的右子树中递归调用这个函数,并将返回值赋给当前节点的右子节点。
  4. 返回当前节点。

代码

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

        return root;
    }
};

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

思路

  • 首先,如果树为空,就直接返回0。
  • 然后,如果根节点的值大于要删除的节点的值,就在根节点的左子树中递归调用这个函数,如果根节点的值小于要删除的节点的值,就在根节点的右子树中递归调用这个函数。如果根节点的值等于要删除的节点的值,就进行以下操作:
    • 如果要删除的节点没有子节点,就直接返回nullptr。
    • 如果要删除的节点只有左子节点,就返回左子节点。
    • 如果要删除的节点只有右子节点,就返回右子节点。
    • 如果要删除的节点有左右子节点,就找到左子树中最右边的节点,将这个节点的右子树设为要删除的节点的右子树,然后返回左子树。
  • 最后,无论是哪种情况,都返回根节点。

代码

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(!root) return 0;

        if(root->val > key )
        {
            root->left = deleteNode(root->left, key);
        }
        else if(root->val < key)
        {
            root->right = deleteNode(root->right, key);
        }
        else
        {
            if(!root->right && !root->left)
            {
                return nullptr;
            }
            else if(!root->right) 
            {
                return root->left;
            }
            else if(!root->left) 
            {
                return root->right;
            }
            else
            {
                TreeNode* left = root->left;
                TreeNode* right = root->right;

                while(left->right)
                    left = left->right;
                left->right = right;
                return root->left;
            }            
        }
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值