代码随想录训练营第21天|LeetCode 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

参考

代码随想录

题目一:LeetCode 530.二叉搜索树的最小绝对差

这个题和之前的验证二叉搜索树的题一样,可以将二叉树转化为数组,然后遍历数组求差值就可以了。

class Solution {
public:
    void traversal(vector<int>& nums,TreeNode* root)
    {
        if(root == nullptr) return ;
        traversal(nums,root->left);
        nums.push_back(root->val);
        traversal(nums,root->right);
    }
    int getMinimumDifference(TreeNode* root) {
        vector<int> nums;
        traversal(nums,root);
        int min = nums[1]-nums[0];
        for(int i=1;i<nums.size()-1;i++)
            min = (min > nums[i+1] - nums[i]) ? nums[i+1] - nums[i] : min;
        return min;
    }
}

如果不使用数组,可以额外定义一个指针记录上一个节点,在遍历二叉树过程中就可以计算差值,代码如下:

class Solution {
public:
    int min = INT_MAX;
    TreeNode* pre = nullptr;
    void traversal(TreeNode* root)
    {
        if(root == nullptr) return;
        traversal(root->left);
        if(pre != nullptr)  
            min = (root->val - pre->val < min) ? (root->val - pre->val) : min;
        pre = root;
        traversal(root->right);
    }
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        return min;
    }
};

题目二:LeetCode 501.二叉搜索树中的众数

用unordered_map来统计每个数值出现的次数,然后将unordered_map放入的vector中,用sort()函数进行排序,再输出结果。这样做比较简单,但没有用到二叉搜索树的性质。

class Solution {
public:
    void traversal(TreeNode* root,unordered_map<int,int>& mp)
    {
        if(root == nullptr) return ;
        traversal(root->left,mp);
        mp[root->val]++;
        traversal(root->right,mp);
    }
    bool static comp(pair<int,int>& x,pair<int,int>& y)
    {
        return x.second > y.second;
    }
    vector<int> findMode(TreeNode* root) {
        unordered_map<int,int> mp;
        vector<int> res;
        traversal(root,mp);
        vector<pair<int,int>> vec(mp.begin(),mp.end());
        sort(vec.begin(),vec.end(),comp);
        res.push_back(vec[0].first);
        for(int i=1;i<vec.size();i++)
            if(vec[i].second == vec[0].second)  res.push_back(vec[i].first);
            else break;
        return res;   
    }
};

题目三:LeetCode 236. 二叉树的最近公共祖先

  1. 确定递归函数的参数和返回值
    参数:根节点,节点q和节点q
    返回值:如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
  1. 确定终止条件
    如果传入的根节点为空,说明已经到底了,返回空;如果根节点等于p或q,就返回p或者q。
if (root == q || root == p || root == NULL) return root;
  1. 确定单层递归逻辑
    在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)。
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);

如果left 和 right都不为空,说明此时root就是最近公共节点。这个比较好理解
如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之亦然。

if (left == NULL && right != NULL) return right;
else if (left != NULL && right == NULL) return left;
else  { //  (left == NULL && right == NULL)
    return NULL;
}

整体代码如下:

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

        if (left == NULL && right != NULL) return right;
        else if (left != NULL && right == NULL) return left;
        else  { //  (left == NULL && right == NULL)
            return NULL;
        }

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第二十二算法训练营主要涵盖了Leetcode题目的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组找到长度最小的子数组,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆昔z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值