算法-二叉树:二叉搜索树中的众数
将二叉搜索树中出现次数最多的元素的集合输出,当有多个要输出的元素时不用考虑输出顺序。
思路解析:
- 如果是普通二叉树的话,可以这么做:
- 遍历一遍树,存入map,key为元素,value为出现次数;
- 将map转存为vector,根据value从大到小排序;
- 遍历vector,如果和vector[0].second相等的话,就存入集合,否则直接break结束程序。
- 对于二叉搜索树来说,可以这么做:
- 采用一次中序遍历(利用pre和cur)得到每个元素的出现次数(用数组保存);
- 再遍历一次数组找出最大频率;
- 再遍历一次数组找出和最大频率相等的元素放入集合。
其实只需遍历一次二叉搜索树(利用pre和cur)即可,先初始化最大频率为0,当频率大于最大频率时,将最大频率更新为频率,同时清空之前的结果集。这个方法可以使用递归或者迭代法实现。
//递归实现
int maxCount = 0;//最大频率
int ccount = 0;//频率
TreeNode* pre = NULL;
vector<int> result;
void searchBST(TreeNode* root){
if(root = NULL) return;
searchBST(root->left);//左
//中
if(pre == NULL){ //第一个节点
ccount = 1;
}
else if(pre->val == root->val){
ccount ++;
}
else{ //与前一个节点不同,重置count
ccount = 1;
}
pre = root; //更新上一个节点
if(ccount == maxCount){ //与最大频率相等,新的元素出现了
result.push_back(root->val);//将新元素推进来
}
if(ccount > maxCount){ //新的最大频率出现了,清除结果集(count小于maxCount的情况不考虑)
maxCount = ccount;
result.clear();
result.push_back(root->val);//不要忘记将新的频率高的值放进集合中!
}
//右
searchBST(root->right);
}
//迭代法实现
void searchBST(TreeNode* root){
if(root = NULL) return;
stack<TreeNode*> st;
int maxCount = 0;//最大频率
int ccount = 0;//频率
TreeNode* pre = NULL;
TreeNode* cur = root;
vector<int> result;
while (!st.empty() || cur!=NULL) {
if(cur!=NULL){ //左
st.push(cur);
cur = cur->left;
}
else{
cur = st.top();//中
st.pop();
if(pre == NULL){ //第一个节点
ccount = 1;
}
else if(pre->val == cur->val){
ccount++;
}
else{ //与上一个元素值不同了,新的元素出现了
ccount=1;
}
pre = cur;
if(ccount == maxCount){
result.push_back(root->val);//将新元素推进来
}
if(ccount > maxCount){
maxCount = ccount;
result.clear();
result.push_back(root->val);
}
cur = cur->right;//右
}
}
}