LeetCode 501.二叉搜索树的众数

题目

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

假定 BST 有如下定义:

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

提示:如果众数超过1个,不需考虑输出顺序

题目链接

示例

给定 BST [1,null,2,2]

   1
    \
     2
    /
   2

题目分析

法1-二叉树转化为数组

由于给定的树是二叉搜索树,所以只需要中序遍历该树,得到一个有序递增数组,将问题转化为单调数组求众数再使用双指针法遍历数组,得到数组众数。

二叉树的中序遍历:

void InOrder(tree root){
    InOrder(root->left);
    // 泛指对当前结点的操作
    visit(root);
    InOrder(root->right);
}

求数组众数:

// 设数组为vector res;
int flag = 1;
int max = 1;
for (int i = 1; i < res.size(); i++){
    if (temp[i-1] == temp[i]){
        flag++;
    }else {
        flag = 1;
    }
    if (flag == max){
        res.push_back(temp[i]);
    }else if (flag > max){
        res.clear();
        max = flag;
        res.push_back(temp[i]);
    }
}

法2-不借助数组

实际上,也可以不借助数组而求众数。

通过中序遍历,记录每一次遍历到结点值,比较相邻结点是否相同,使用temp记录当前数字出现次数;使用max记录出现最多数字次数。

题目解答

法1-二叉树转换为数组

class Solution {
public:
    vector temp, res;
    void MidOrder(TreeNode* root, vector &temp){
        if (root == NULL) return ;

        MidOrder(root->left, temp);
        temp.push_back(root->val);
        MidOrder(root->right, temp);
    }

    vector findMode(TreeNode* root) {
        if (root == NULL) return res;
        if (root->left == NULL && root->right == NULL) {
            res.push_back(root->val);
            return res;
        }

        MidOrder(root, temp);

        int flag = 1;
        int max = 1;
        res.push_back(temp[0]);

        for (int i = 1; i < temp.size(); i++){
            if (temp[i - 1] == temp[i]){
                flag++;
            }else {
                flag = 1;
            }
            if (flag == max){
                res.push_back(temp[i]);
            }else if (flag > max){
                max = flag;
                res.clear();
                res.push_back(temp[i]);
            }
        }

        return res;
    }
};

法2-不借助数组

class Solution {
public:
    vector res;
    int flag = 0;
    int pre;
    int cur;
    int max = 1;
    int temp = 1;

    void InOrder(TreeNode* root){
        if (root == NULL) return ;

        InOrder(root->left);

        if (flag == 0){
            flag = 1;
            pre = root->val;
            res.push_back(pre);
        }else {
            cur = root->val;
            if (pre == cur){
                temp++;
            }else {
                temp = 1;
            }
            if (temp > max){
                max = temp;
                res.clear();
                res.push_back(pre);
            }else if (temp == max){
                res.push_back(cur);
            }
            pre = cur;
        }
        
        InOrder(root->right);
    }
    vector findMode(TreeNode* root) {
        if (root == NULL) return res;
        if (root->left == NULL && root->right == NULL) {
            res.push_back(root->val);
            return res;
        }
        InOrder(root);

        return res;
    }
};

你可能感兴趣的:(LeetCode 501.二叉搜索树的众数)