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

文章介绍了如何使用递归和双指针方法解决LeetCode中的三个二叉搜索树问题:最小绝对差、找到众数以及求最近公共祖先。涉及中序遍历、计数和自底向上的后序遍历策略。

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

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

class Solution {
public:
    int result = INT_MAX;
    TreeNode* pre = NULL;
    void traversal(TreeNode* cur) {
        if (cur == NULL) return;
        traversal(cur->left);
        if (pre != NULL){       // 中
        result = min(result, cur->val - pre->val);
    }
        pre = cur; // 记录前一个
        traversal(cur->right);
    }
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        return result;
    }
};

 首先可以使用递归法,按照中序遍历搜索二叉树就是一个递增的序列,想要得到最小绝对差的话就只需要比较前后两个节点即可,所以需要一个全局变量pre来记录当前节点的前一个节点。

501.二叉搜索树中的众数

class Solution {
private:
    int count = 0;
    int maxCount = 0;
    TreeNode* pre = NULL;
    vector<int> result;
    void searchBST(TreeNode* cur) {
        if (cur == NULL) return;
        searchBST(cur->left);

        if (pre == NULL)        // 第一个节点
            count = 1;
        else if (pre->val == cur->val)
            count++;
        else count = 1;
        pre = cur;
        
        if (count == maxCount) { // 如果和最大值相同,放进result中
            result.push_back(cur->val);
        }

        if (count > maxCount) {
            maxCount = count;
            result.clear();
            result.push_back(cur->val);
        }

        searchBST(cur->right);      // 右
        return ;
    }
public:   
    vector<int> findMode(TreeNode* root) {
        count = 0;
        maxCount = 0;
        pre = NULL; // 记录前一个节点
        result.clear();
        searchBST(root);
        return result;
    }
};

 由于这道题也是二叉搜索树,可以进行中序遍历,如果连续两个值相同,则说明这个值存在至少两次,count次数++。如果到了maxCount,就将result数组更新,再重新进行加载众数。

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

class Solution {
public:
    TreeNode* travsel(TreeNode* node, TreeNode* p, TreeNode* q) {
        if (node == NULL) return NULL;
        if (node == p || node == q) return node;

        TreeNode* left = travsel(node->left, p, q);
        TreeNode* right = travsel(node->right, p, q);

        if (left && right) return node;
        if (!left && right) return right;
        if (left && !right) return left;

        return NULL;
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        TreeNode* result = travsel(root, p, q);
        return result;
    }
};

采用后序遍历,终止条件为遇到空或遇到目标节点,然后先后遍历左右节点。在处理当前节点时要先判断左右子树是否存在目标节点,若存在则返回目标接地,否则返回NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值