LeetCode #501:Find Mode In BST(查找二叉搜索树的众数)

题目描述

本题属于简单题,只需要中序遍历两次分别找出最大频率、将最大频率的数加入结果集即可(二叉搜索树的中序遍历是有序的)。但若要使用一次遍历就得到答案,就必须设计一系列辅助变量和策略。

/**
 * 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:
    vector<int> findMode(TreeNode* root) {
        inorder(root);
        return res;
    }

    TreeNode* pre = NULL; // 使用一个辅助指针,记录当前结点的前驱,这样当前结点的值才能和前一个结点比较
    vector<int> res;
    int count = 0;
    int maxCount = 0;

    void inorder(TreeNode* cur) {
        if(cur == NULL)
            return;
        
        inorder(cur->left);
        if(pre == NULL) { // 中序的第一个结点
            count = 1;
        } else if(cur->val == pre->val) { // 与前一个结点值相同是count++
            count ++;
        } else { // cur->val != pre->val,与前一个结点值不同时复原count
            count = 1;
        }
        pre = cur; // 更新前驱

        if(count == maxCount) // 当前个数和最大个数相等时,先将该数加入结果集
            res.push_back(cur->val);
        if(count > maxCount) { // 当前个数大于最大个数时
            maxCount = count; // 当前val的数目就是新的maxCount,要更新maxCount的值
            res.clear(); // 同时须清空结果集(因为结果集之前的内容都是按老maxCount得出的)
            res.push_back(cur->val); // 再将val压入清空后的结果集
        }
        
        inorder(cur->right);
    }
};

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注