0
点赞
收藏
分享

微信扫一扫

算法-二叉树:二叉搜索树中的众数

算法-二叉树:二叉搜索树中的众数

将二叉搜索树中出现次数最多的元素的集合输出,当有多个要输出的元素时不用考虑输出顺序。

思路解析:

  1. 如果是普通二叉树的话,可以这么做:
  • 遍历一遍树,存入map,key为元素,value为出现次数;
  • 将map转存为vector,根据value从大到小排序;
  • 遍历vector,如果和vector[0].second相等的话,就存入集合,否则直接break结束程序。
  1. 对于二叉搜索树来说,可以这么做:
  • 采用一次中序遍历(利用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;//右
        }
    }
}
举报

相关推荐

0 条评论