Leetcode第501题二叉搜索树中的众数|C语言

该代码实现了一个算法,通过双指针和中序遍历二叉树来找出树中的众数(出现频率最高的数值)。在遍历过程中,维护临时频率(temp_freq)和最大频率(freq),当临时频率等于最大频率时,将该值加入众数数组;若临时频率超过最大频率,则更新最大频率并清空众数数组。
摘要由CSDN通过智能技术生成

大致思路:采用双指针,对树进行中序遍历,当前后指针指向的结点的值相等时,临时频率(temp_freq)自增。当临时频率等于目前的最大频率(freq)时,说明该值也为众数,加入众数数组;当临时频率超过目前的最大频率时,临时频率成为最大频率,更新最大频率的值(*freq=temp_freq),并清空众数数组,令数组的指针returnSize指向0就好啦,并将该最大频率对应的值作为第一个众数加入数组。

void Find_many(struct TreeNode* root,struct TreeNode** pre,int *freq,int *returnSize,int *temp_freq,int *Num){
//root为根节点,遍历中作为后指针,pre为前指针,freq保存至今为止的最大频率,returnSize为数组下标,用于遍历中将数加入数组
//temp_freq保存遍历结点的频率,即临时频率,Num为众数数组
    if(root==NULL)
        return;
    Find_many(root->left,pre,freq,returnSize,temp_freq,Num);
    
    if(*pre!=NULL){
        if((*pre)->val==root->val)
            (*temp_freq)++;
        else
            (*temp_freq)=1;
     }
    if((*temp_freq)==(*freq))
        Num[(*returnSize)++]=root->val;
    else if((*temp_freq)>(*freq)){
        (*freq)=(*temp_freq);
        (*returnSize)=0;
        Num[(*returnSize)++]=root->val;
    }
    (*pre)=root;
    Find_many(root->right,pre,freq,returnSize,temp_freq,Num);
}

int* findMode(struct TreeNode* root, int* returnSize){
    int *Num=(int *)malloc(sizeof(int)*10001);
    (*returnSize)=0;
    struct TreeNode* pre=NULL;
    int freq=1;
    int temp_freq=1;
    Find_many(root,&pre,&freq,returnSize,&temp_freq,Num);
    return Num;
}

执行情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值