Find Mode in Binary Search Tree
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.
解析:二叉搜索树中序遍历的序列是递增排序数列,先遍历一遍统计其中出现次数最高的频率,然后再把出现频率最高的那些数找出来。
代码:
/**
* 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) {
vector<int> ans;
int cnt=0;
int curcount=0;
int maxcoutn=0;
int cur=INT_MIN;
Mode(root,ans,0,curcount,maxcoutn,cur);
curcount=0;
cur=INT_MIN;
Mode(root,ans,1,curcount,maxcoutn,cur);
return ans;
}
void Mode(TreeNode* root,vector<int>&mode,int flag,int &curcount,int &maxcount,int &cur)
{
if (root==NULL)
return ;
Mode(root->left,mode,flag,curcount,maxcount,cur);
if (cur==root->val)
{
curcount++;
}
else
{
curcount=1;
cur=root->val;
}
if (curcount>maxcount)
{
maxcount=curcount;
}
else if(curcount==maxcount)
{
if (flag==1)
{
mode.push_back(cur);
}
}
Mode(root->right,mode,flag,curcount,maxcount,cur);
return ;
}
};