问题:https://leetcode.com/problems/find-mode-in-binary-search-tree/?tab=Description
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].
分析:二叉搜索树的中序遍历的结果恰好是所有数的递增序列,根据中序遍历结果,对于当前遍历结点,标记maxCount为最大出现次数,tempCount为当前数字出现的次数,currentVal为当前保存的值。
首先,tempCount++表示当前的数字出现次数+1,如果当前结点的值不等于保存的值,就更新currentVal的值,并且将tempCount标记为1。
接下来,如果tempCount即当前数字出现的次数大于maxCount,就更新maxCount,并且将result数组清零,并将当前数字放入result数组中;如果tempCount只是等于maxCount,说明是出现次数一样的,则将当前数字直接放入result数组中。
参考C++代码:
/**
* 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:
vector<int> findMode(TreeNode* root) {
inorder(root);
return result;
}
private:
vector<int> result;
int maxcount=0;
int tem=0;
int cur=0;
void inorder(TreeNode* root){
if(NULL==root) return;
inorder(root->left);
tem++;
if(root->val!=cur){
cur=root->val;
tem=1;
}
if(tem>maxcount){
maxcount=tem;
result.clear();
result.push_back(root->val);
}
else if(tem==maxcount){
result.push_back(root->val);
}
inorder(root->right);
}
};