二叉树二叉搜索树中的众数(leetcode501)

Posted AI 菌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树二叉搜索树中的众数(leetcode501)相关的知识,希望对你有一定的参考价值。

一、题目

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

假定 BST 有如下定义:

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

二、 题解

根据二叉搜索树的性质可知,二叉搜索树的中序遍历序列是一个非递减的有序序列。所以对于中序遍历序列,重复的数一定是连续出现的。因此,本题我们可以进行如下处理:

  • 顺序扫描中序遍历序列,用 base 记录当前的数字,用 count 记录当前数字重复的次数。
  • 用 maxCount 来维护已经扫描过的数当中出现最多的那个数字的出现次数,用 answer 数组记录出现的众数。

可以把这个过程写成一个update 函数,这样我们在寻找出现次数最多的数字的时候就可以省去一个哈希表带来的空间消耗。

三、实现

/**
 * 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> answer;
    int base, count, maxCount;

    void update(int x)
    {
        if(x==base)
        {
            count += 1;
        }
        else
        {  //如果数是新的,则count置1,base变为此数x
            count = 1;
            base = x;
        }

        if(count==maxCount)
        {
            answer.push_back(base);
        }

        if(count>maxCount)
        {
            maxCount=count;
            answer = vector<int> {base}; //如果计数超过之前的数,则将answer覆盖
        }
    }

    void dfs(TreeNode* node)
    {
        if(!node) return; //迭代必须有终止条件
        dfs(node->left);
        update(node->val);
        dfs(node->right);
    }

    vector<int> findMode(TreeNode* root) {
        dfs(root);
        return answer;
    }
};

提交结果:

以上是关于二叉树二叉搜索树中的众数(leetcode501)的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《二叉树 - 二叉搜索树》中等07 —— LeetCode 501. 二叉搜索树中的众数

LeetCode 501. 二叉搜索树中的众数

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

leetcode简单501二叉搜索树中的众数

剑指Offer-树二叉搜索树中的众数

501. 二叉搜索树中的众数