Leetcode刷題筆記 501. 二叉搜尋樹中的眾數
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個,不需考慮輸出順序
進階:
你可以不使用額外的空間嗎?(假設由遞迴產生的隱式呼叫棧的開銷不被計算在內)
解法
- 最簡單的想法就是把這個樹都遍歷了,用map統計節點value頻率,用vector排個序,最後得出前面高頻的元素。
- 但是沒有很好運用題目給的條件——BST,如果把這顆樹中序遍歷,得到的就是有序的陣列,所以在中序遍歷的中間處理節點
- 我們需要儲存上一個節點的值,
- 如果為空,表示這個是第一個節點
- 比較上一個節點和該節點,相同個數+1
- 不同 個數為1
- 更新節點
- 當現在的個數等於之前的最大值,放入陣列
- 當現在的個數大於最大值,把答案陣列中的數都清除,放入新的值,更新最大值
程式碼
#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的一天哦!
相關文章
- Day21 | 530.二叉搜尋樹的最小絕對差、501.二叉搜尋樹中的眾數 、236. 二叉樹的最近公共祖先二叉樹
- Leedcode-二叉搜尋樹中的眾數
- 【亡羊補牢】挑戰資料結構與演算法 第39期 LeetCode 501. 二叉搜尋樹中的眾數(二叉樹)資料結構演算法LeetCode二叉樹
- Leetcode 700. 二叉搜尋樹中的搜尋(DAY 2)LeetCode
- leetcode 700. 二叉搜尋樹中的搜尋 思考分析LeetCode
- 程式碼隨想錄演算法訓練營第18天| 530.二叉搜尋樹的最小絕對差, 501.二叉搜尋樹中的眾數 , 236. 二叉樹的最近公共祖先演算法二叉樹
- 程式碼隨想錄演算法訓練營day18 |530.二叉搜尋樹的最小絕對差 501.二叉搜尋樹中的眾數 236. 二叉樹的最近公共祖先演算法二叉樹
- LeetCode刷題記63-109. 有序連結串列轉換二叉搜尋樹【檢視解法】LeetCode
- LeetCode-096-不同的二叉搜尋樹LeetCode
- 程式碼隨想錄day18 || 530 二叉搜尋樹最小差,501 二叉搜尋樹眾數,236 二叉搜尋樹最近公共祖先
- Leetcode刷題——求眾數LeetCode
- 程式碼隨想錄演算法訓練營第十七天|leetcode654. 最大二叉樹、leetcode617.合併二叉樹、leetcode700.二叉搜尋樹中的搜尋、leetcode98.驗證二叉搜尋樹演算法LeetCode二叉樹
- LeetCode-095-不同的二叉搜尋樹 IILeetCode
- [leetCode]95. 不同的二叉搜尋樹 IILeetCode
- LeetCode-230-二叉搜尋樹中第K小的元素LeetCode
- Leetcode230. 二叉搜尋樹中第K小的元素LeetCode
- LeetCode98. 驗證二叉搜尋樹LeetCode
- LeetCode-173-二叉搜尋樹迭代器LeetCode
- LeetCode-098-驗證二叉搜尋樹LeetCode
- 【LeetCode】98. 驗證二叉搜尋樹LeetCode
- LeetCode-099-恢復二叉搜尋樹LeetCode
- LeetCode 95 | 構造出所有二叉搜尋樹LeetCode
- 每日一題演算法:2020年9月24日 [二叉搜尋樹中的眾數] findMode每日一題演算法
- leetcode 刷題之深度優先搜尋LeetCode
- LeetCode 刷題筆記LeetCode筆記
- leetcode刷題筆記LeetCode筆記
- 2020.12.21-2020.12.27 leetcode刷題總結(拓撲排序&蓄水池抽樣&二叉搜尋樹&線段樹)LeetCode排序
- LeetCode 熱題 HOT 100 Java題解——96. 不同的二叉搜尋樹LeetCodeJava
- leetcode 235. 二叉搜尋樹的最近公共祖先LeetCode
- dfs 驗證搜尋二叉樹——leetcode98二叉樹LeetCode
- leetcode-1382. 將二叉搜尋樹變平衡LeetCode
- 【ALGO】Leetcode 98.驗證二叉搜尋樹GoLeetCode
- 二叉搜尋樹
- leetcode刷題筆記605LeetCode筆記
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- (117)235. 二叉搜尋樹的最近公共祖先(leetcode)LeetCode
- LeetCode 刷題—樹LeetCode