題目
原題鏈接
給定一個有相同值的二叉搜索樹(BST),找出 BST 中的所有衆數(出現頻率最高的元素)。
假定 BST 有如下定義:
- 結點左子樹中所含結點的值小於等於當前結點的值
- 結點右子樹中所含結點的值大於等於當前結點的值
- 左子樹和右子樹都是二叉搜索樹
例如:
給定 BST [1,null,2,2],
1
\
2
/
2
返回[2].
提示: 如果衆數超過1個,不需考慮輸出順序
思路
其實這道題的思路很簡單(但是很難想到),就是利用“二叉搜索樹中序遍歷序列有序”這個定理,將序列存入一個 vector
內,再求衆數就很簡單了,具體咋求看下面:
定義兩個輔助變量:一個是遍歷到當前這個數的最大連續長度
num
,另一個是目前找到的“衆數”的出現頻率maxn
(自然,這是要不斷更新的)
for(s[1…s.size()-1]),如果當前數與前一個數相等,num++,不相等,將num
賦值爲1
我們用num
來更新maxn
,如果比它大,將答案數組清空後壓入當前的數,maxn = num
;否則的話(也就是相等),則直接壓入即可。
以上就是大體的思路,接下來是代碼:
/**
* 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 {
public:
int num = 1, maxn = 1;
vector<int> s, ans;
vector<int> findMode(TreeNode* root) {
if(!root) return ans;
inorder(root);
ans.push_back(s[0]);
for(int i = 1; i < s.size(); ++ i) {
if(s[i] == s[i-1]) num ++;
else num = 1;
if(num > maxn) {
ans.clear();
maxn = num;
ans.push_back(s[i]);
}else if(num == maxn) {
ans.push_back(s[i]);
}
}
return ans;
}
void inorder(TreeNode* root) {
if(!root) return ;
inorder(root -> left);
s.push_back(root -> val);
inorder(root -> right);
}
};
另,這道題還可以用 Morris
算法來解,也就是用 pre
和 cur
這兩個變量來代替我們的整個 s
序列,可以說是將遞歸換成迭代了。