大致思路:采用双指针,对树进行中序遍历,当前后指针指向的结点的值相等时,临时频率(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;
}