C++刷题笔记(25)——leetcode530、501

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

在这里插入图片描述

解法一:中序遍历

利用数组:
98.验证二叉搜索树中就有利用二叉搜索树输出数组的升序性,这里也可以通过输出数组,转换成在有序数组上求两个数的最小差值。

class Solution {
private:
vector<int> vec;
void traversal(TreeNode* root) {
    if (root == NULL) return;
    traversal(root->left);
    vec.push_back(root->val); // 将二叉搜索树转换为有序数组
    traversal(root->right);
}
public:
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        if (vec.size() < 2) return 0;
        int result = INT_MAX;
        for (int i = 1; i < vec.size(); i++) { // 统计有序数组的最小差值
            result = min(result, vec[i] - vec[i-1]);
        }
        return result;
    }
};

利用指针:
利用两个指针,一个记录当前节点、一个记录前一个节点
在遍历过程中一边遍历一边更新答案,不用再创建数组来保存
在这里插入图片描述

class Solution {
public:
    int result = INT_MAX;
    TreeNode* pre;                    //指向前一个节点
    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;
    }
};

解法二:迭代法

同样是用栈模仿中序遍历

class Solution {
public:
    int getMinimumDifference(TreeNode* root) {
        stack<TreeNode*> st;
        TreeNode* pre = NULL;
        TreeNode* cur = root;
        int result = INT_MAX;
        while (cur != NULL || !st.empty()) {
            if (cur != NULL) {
                st.push(cur);
                cur = cur->left;
            }
            else {
                cur = st.top();
                st.pop();
                if (pre != NULL) {
                    result = min(result, cur->val - pre->val);
                }
                pre = cur;
                cur = cur->right;
            }
        }
        return result;
    }
};

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

在这里插入图片描述

解法一:递归法

同样是使用两个指针,cur指向当前节点、pre指向当前节点的前一个节点,然后中序遍历二叉搜索树,因为加入了众数,所以原本遍历的升序大于结构变成了大于等于,因此就比较相邻元素出现的频率,将频率最大的数放入结果中

class Solution {
public:
    int maxcount = 0;                                          //最大频率
    int count = 0;                                             //当前元素出现的频率
    TreeNode* pre=NULL;                                        //记录前一个节点,初始化为NULL,当pre=null时可知此时比较的是第一个节点
    vector<int> result;
    void searchBST(TreeNode* cur) {                            //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.push_back(cur->val);     //如果和最大值相同,放入result中,众数可能有多个
        if (count > maxcount) {                                //如果计数大于最大值频率
            maxcount = count;                                  //更新最大频率
            result.clear();                                    //清空result,之前result中的元素都失效
            result.push_back(cur->val);                        //将当前节点的值放入result
        }
        searchBST(cur->right);                                 //右
        return;
    }
    vector<int> findMode(TreeNode* root) {
        searchBST(root);
        return result;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值