501.Find Mode in Binary Tree

501.Find Mode in Binary Search Tree

难度:Easy

Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred element) in the given BST.

Assume a BST is defined as follows:

The left subtree of a node contains only nodes with keys less than or equal to the node's key. The right subtree of a node contains only nodes with keys greater than or equal to the node's key. Both the left and right subtrees must also be binary search trees.

For example:
Given BST [1,null,2,2],

   1
    \
     2
    /
   2
 

return [2].

Note: If a tree has more than one mode, you can return them in any order.

Follow up: Could you do that without using any extra space? (Assume that the implicit stack space incurred due to recursion does not count)

适应于任何树的方法,直接遍历法。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
unordered_map<int,int>all;
void traversal(TreeNode* root)
{
    if(!root) return;
    all[root->val]++;
    traversal(root->left);
    traversal(root->right);
}
public:
    vector<int> findMode(TreeNode* root) {
        vector<int>res;
        if(!root) return res;
        traversal(root);
        int count=0;
        for(auto& a: all)
        {
            count = max(count, a.second);
        }
        for(auto& a:all)
            if(a.second == count) res.push_back(a.first);
        return res;
    }
};

执行用时 :52 ms, 在所有 C++ 提交中击败了22.86%的用户 内存消耗 :27.1 MB, 在所有 C++ 提交中击败了12.78%的用户

考虑到是BST,可以充分利用其已经排好序的先验知识。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
void traversal(TreeNode* cur, TreeNode*& pre, int& cnt, int& max_cnt,vector<int>& res)
{
    if(!cur) return;
    traversal(cur->left,pre,cnt,max_cnt,res);
    if(pre)
        cnt = cur->val == pre->val ?  cnt+1: 1 ;
    pre=cur;
    if(cnt>max_cnt)
    {
        max_cnt=cnt;
        res.clear();
        res.push_back(cur->val);
    }   
    else if(cnt == max_cnt )
        res.push_back(cur->val);
    traversal(cur->right,pre,cnt,max_cnt,res);

}
public:
    vector<int> findMode(TreeNode* root) {
        vector<int>res;
        if(!root) return res;
        int count=1;
        int max_cnt=0;
        TreeNode* pre=nullptr;
        traversal(root,pre,count,max_cnt, res);
        return res;
    }
};

执行用时 :32 ms, 在所有 C++ 提交中击败了72.22%的用户 内存消耗 :23MB, 在所有 C++ 提交中击败了95.89%的用户

Last updated