代码随想录算法训练营day18

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

1.1 题目

. - 力扣(LeetCode)

1.2 题解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int getMinimumDifference(TreeNode* root) 
    {
        vector<int> vec;
        Reversal(root,vec);
        int minValue=vec[1]-vec[0];
        for(int i=0;i<vec.size();i++)
        {
            if(i>0)
            {
                int result=abs(vec[i]-vec[i-1]);
                minValue=minValue>result?result:minValue;

            }
        }
        return minValue;
    }
    void Reversal(TreeNode* node,vector<int>& vec)
    {
        //中序遍历求数组
        //确定递归终止条件
        if(node==nullptr)return;
        //确定单层递归逻辑
        //左
        Reversal(node->left,vec);
        //中
        vec.push_back(node->val);
        //右
        Reversal(node->right,vec);

    }
};

2.二叉搜索树中的众数

2.1 题目

. - 力扣(LeetCode)

2.2 题解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool static cmp(const pair<int, int>& a, const pair<int, int>& b) 
    {
        return a.second > b.second;
    }
    vector<int> findMode(TreeNode* root)
    {
        vector<int> vec;
        vector<int> result;
        Traversal(root, vec);
        //用map来统计值以及出现的次数
        unordered_map<int, int> map;
        for (auto i : vec)
        {
            map[i]++;
        }
        //map的key是元素值,value是出现的次数
        //map转为vector
        vector<pair<int, int>> vec1(map.begin(), map.end());
        //按照出现的次数从大到小排序
        sort(vec1.begin(), vec1.end(), cmp); 
        //将出现次数最大的值加进结果集
        result.push_back(vec1[0].first);
        //之后看有没有出现次数和最大的一样的
        for (int i = 1; i < vec1.size(); i++) {
            // 取最高的放到result数组中
            if (vec1[i].second == vec1[0].second) result.push_back(vec1[i].first);
            else break;
        }
        return result;

    }
    void Traversal(TreeNode* node, vector<int>& vec)
    {
        if (node == nullptr)return;
        Traversal(node->left, vec);
        vec.push_back(node->val);
        Traversal(node->right, vec);
    }
};

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

3.1 题目

. - 力扣(LeetCode)

3.2 题解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) 
    {
		if (root == nullptr)return nullptr;
		if (root == p || root == q)return root;
		TreeNode* left = lowestCommonAncestor(root->left,p,q);
		TreeNode* right = lowestCommonAncestor(root->right,p,q);
        if (left != nullptr && right != nullptr)return root;

		if (left == nullptr && right != nullptr)return right;
		else if (left != nullptr && right == nullptr)return left;
		else return nullptr;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值