501. 二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

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

示例 1:

501. 二叉搜索树中的众数_第1张图片

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]

提示:

  • 树中节点的数目在范围 [1, 104] 内
  • -105 <= Node.val <= 105

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

采用双指针策略

class Solution {
private:
    int count = 0;
    int maxCount = 0;
    TreeNode *pre = NULL;
    vector result;

    void searchBST(TreeNode *cur) {
        if (cur == nullptr) return;
        //    左
        searchBST(cur->left);
        //  中
        if (pre == nullptr) {
            count = 1;
        } else if (pre->val == cur->val) {
            count++;
        } else { // 与前一个节点数值不同
            count = 1;
        }
        //让pre为cur的前一个指针
        pre = cur;
        //此时为最大众数
        if (count == maxCount) {
            //则放入当前结点
            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 findMode(TreeNode *root) {
        //先清空数组避免有冗余数据
        result.clear();
        searchBST(root);
        return result;
    }
};

你可能感兴趣的:(算法,数据结构)