算法Day21 | 530.二叉搜索树的最小绝对差, 501.二叉搜索树中的众数, 236. 二叉树的最近公共祖先

文章讲述了如何解决与二叉搜索树相关的三个问题:最小绝对差通过中序遍历计算,众数通过维护最大频率和元素集合,最近公共祖先利用后序遍历求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

530.二叉搜索树的最小绝对差

题目链接:530.二叉搜索树的最小绝对差
是二叉搜索树,如果是深度遍历, 采用中序遍历。再构造一个前节点,与当前节点做差即可。

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

preroot走过的前一个节点


501.二叉搜索树中的众数

题目链接: 501.二叉搜索树中的众数
设置一个maxCnt来存储元素出现的最大频率,实时更新,如果有第二个元素的频率和maxCnt一样大,那么表示目前为止有两个出现频率最多的。
递归函数不需要有返回值,都用maxCntres来统计了

class Solution {
public:
    int maxCnt = 0/*记录最大出现频率*/, cnt = 0/*记录出现频率*/;
    vector<int> res;
    TreeNode* pre = nullptr;//为cur的前一个指针
    void traversal(TreeNode* cur) {
        if (!cur) return;
        traversal(cur->left);//左

        //中
        //更新cnt
        if (!pre) {//pre指向空节点,cur为遍历的第一个节点
            cnt = 1;//cur指向的数出现的频率为1
        } else if (pre->val == cur->val) {//双指针指向的值相等
            ++cnt;
        } else {//双指针指向的不相等,则重置cnt值。(cur一定大于pre的值,因为是BST)
            cnt = 1;
        }
        if (maxCnt < cnt) {
            maxCnt = cnt;//更新maxCnt
            res.clear();//更新res,清空之前的
            res.push_back(cur->val);
        } else if (maxCnt == cnt){
            res.push_back(cur->val);
        }
        pre = cur;//移动指针
        
        traversal(cur->right);//右
    }
    vector<int> findMode(TreeNode* root) {
        traversal(root);
        return res;
    }
};

236. 二叉树的最近公共祖先

题目链接: 236. 二叉树的最近公共祖先
从下往上遍历,求高度,用后序遍历。

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (!root || root == q || root == p) return root;
        auto left = lowestCommonAncestor(root->left, p, q);
        auto right = lowestCommonAncestor(root->right, p, q);
        if (left && right) return root;
        if (left) return left;
        if (right) return right;
        return nullptr;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值