Leetcode刷題筆記 501. 二叉搜尋樹中的眾數

jialun0116發表於2020-09-24

501. 二叉搜尋樹中的眾數

知識點:二叉樹、遞迴
時間:2020年9月24日
題目連結:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/

題目
給定一個有相同值的二叉搜尋樹(BST),找出 BST 中的所有眾數(出現頻率最高的元素)。

假定 BST 有如下定義:

結點左子樹中所含結點的值小於等於當前結點的值
結點右子樹中所含結點的值大於等於當前結點的值
左子樹和右子樹都是二叉搜尋樹

示例1
輸入

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

   1
    \
     2
    /
   2

輸出

[2]

提示:
如果眾數超過1個,不需考慮輸出順序

進階:
你可以不使用額外的空間嗎?(假設由遞迴產生的隱式呼叫棧的開銷不被計算在內)

解法

  1. 最簡單的想法就是把這個樹都遍歷了,用map統計節點value頻率,用vector排個序,最後得出前面高頻的元素。
  2. 但是沒有很好運用題目給的條件——BST,如果把這顆樹中序遍歷,得到的就是有序的陣列,所以在中序遍歷的中間處理節點
  3. 我們需要儲存上一個節點的值,
    1. 如果為空,表示這個是第一個節點
    2. 比較上一個節點和該節點,相同個數+1
    3. 不同 個數為1
  4. 更新節點
  5. 當現在的個數等於之前的最大值,放入陣列
  6. 當現在的個數大於最大值,把答案陣列中的數都清除,放入新的值,更新最大值

程式碼

#include <stdio.h>
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
/*
class Solution {
public:
    unordered_map<int,int> m;
    vector<int> ans;
    bool static cmp(const pair<int,int> x,const pair<int,int> y){
        return x.second>y.second;
    }
    void traversal(TreeNode* root){
        if(root==nullptr)return;
        m[root->val]++;
        traversal(root->left);
        traversal(root->right);
        return ;
    }
    vector<int> findMode(TreeNode* root) {
        if(root==nullptr) return  ans;
        traversal(root);
        vector<pair<int,int>> tmp(m.begin(),m.end());
        sort(tmp.begin(), tmp.end(), cmp);
        ans.push_back(tmp[0].first);
        for(int i=1;i<tmp.size();i++){
            if(tmp[i].second == tmp[0].second)
                ans.push_back(tmp[i].first);
            else
                break;
        }
        return ans;
    }
};*/
class Solution {
public:
    int maxcount = 0;
    int nowcount = 0;
    TreeNode* pre;
    vector<int> ans;
    bool static cmp(const pair<int,int> x,const pair<int,int> y){
        return x.second>y.second;
    }
    void traversal(TreeNode* root){
        if(root==nullptr)return;
        traversal(root->left);
        
        if(pre ==nullptr)
            nowcount = 1;
        else if(root->val == pre->val){
            nowcount++;
        else
            nowcount = 1;
            
        pre = root;
        if(nowcount == maxcount){
            ans.push_back(root->val);
        }else if(nowcount > maxcount){
            ans.clear();
            ans.push_back(root->val);
            maxcount = nowcount;
        }
        
        traversal(root->right);
        return ;
    }
    vector<int> findMode(TreeNode* root) {
        traversal(root);
        return ans;
    }
};
int main()
{
    TreeNode node1(1);TreeNode node2(3);  node1.left = &node2;
    TreeNode node3(5);TreeNode node4(5);  node2.right= &node3;node3.right = &node4;
    Solution s;
    vector<int> ans = s.findMode(&node1);
    for(int i:ans)
        cout<<i<<endl;
    return 0;
}

今天也是愛zz的一天哦!

相關文章