501、二叉搜索树中的众数

发布于:2024-07-02 ⋅ 阅读:(16) ⋅ 点赞:(0)

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

class Solution {
private:
    int maxCount = 0; // 最大频率
    int count = 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,之前result里的元素都失效了
            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;
    }
};

要点:重点在单层逻辑的处理中,因为是搜索树,所以按照中序遍历的话节点的值是递增的,所以形象化的可以将二叉树想成一段一段递增的数列,要找到众数,就是找到哪一段或几段是最长的。

所以其实不用遍历两遍:先遍历一遍找到长度最大的,再遍历一遍符合把这个长度val输出。先设立一个maxCount值,并从一开始就将符合的值放进去,之后动态的改变maxCount,当遍历得到的count比现在的maxcount更大时,就更新maxcount,并且把之前放进reslut的值都清空,把新的放进去。