2025.3.17学习记录

一,代码随想录leetcode235二叉搜索树的最近公共祖先

解题思路:本题给出一个二叉搜索树以及两个结点,要求返回这两个结点的最近公共祖先。本题使用递归来解决。1,确定函数的返回类型为二叉树的结点类型。传入的函数参数为一个root结点,还有两个给出的要寻找公共祖先的结点。2,确定返回条件,当传入的root结点为空的时候,直接返回null。3,确定单层递归的逻辑,假如二叉树的p和q结点的数值都小于当前的root结点,就向左递归。并且用left来接收递归的数值。假如left不为空,说明在左子树中找到了满足要求的结点,把left向上返回即可。向右递归的处理逻辑同上。假如不满足上面两种情况,说明p和q此时刚好分别在root结点的两侧,那么root就是最近公共祖先,返回root即可。

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

迭代法:把root数值赋值给cur,假如cur不为空就进入循环,循环内的逻辑与递归法相同。 

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

二,代码随想录leetcode701二叉搜索树中的插入操作

解题思路:本题给定一个数值要求插入到二叉搜索树中。将其作为一个叶子节点插入到二叉搜索树中即可。使用递归法解决。1,确定返回类型为二叉树的结点类型。传入的参数为一个二叉树root结点以及要插入的数值。2,确定返回条件。假如root为空结点,说明此时就是要插入的地方,new一个结点,结点val设置为传入的参数,然后把这个结点向上返回即可。3,单层递归的逻辑,假如val小于当前遍历结点的值,就向左递归,使用left结点接收向左递归的结果。向右递归的逻辑同理。左右递归的逻辑都处理完之后,返回root结点即可。

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

 三,代码随想录leetcode450删除二叉搜索树的结点

解题思路:本题给出一个二叉树以及一个key值,要求在二叉树中找到并且删除这个结点。1,确定返回类型和传入的参数。2,确定返回条件,本题涉及五种条件,没找到,找到了是叶子节点,找到了左空右不空,找到了左不空右空,找到了左右都不空。这里讨论第五种情况,在当前要删除结点的右子树的最左节点,把root的左子树接上,然后就变成了第二种情况。3,确定单层递归逻辑 略。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值