开发者社区> 问答> 正文

有关二叉树的词频统计 问题

现在已经完成代码,可以读取文件中的单词,使其按字典序列输出,如何将其改成按单词出现频率由高至低输出
代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 50
struct tnode{
    char word[MAX];
    int count;
    struct tnode *left,*right;
}; 
struct tnode *treewords(struct tnode *,char *);
void treeprint(struct tnode *);
int main()
{
    char word[MAX];
    FILE *bfp;
    char c;
    int i;
    struct tnode *root;
    root=NULL;
    bfp=fopen("article.txt","r");
    while((c=fgetc(bfp))!=EOF){
        ungetc(c,bfp);
        for(i=0;(c=fgetc(bfp))!=' '&&c!='\n'&&c!=EOF;i++){
            if((c>='A'&&c<='Z')||(c>='a'&&c<='z')){
                c=tolower(c);
                word[i]=c;
            }else
                break;
        }
        word[i]='\0';
        if(strlen(word)>0)
            root=treewords(root,word);
    }
    treeprint(root);
    
    return 0;
}
struct tnode *treewords(struct tnode *p,char *w)
{
    int cond;
    if(p==NULL){
        p=(struct tnode*)malloc(sizeof(struct tnode));
        strcpy(p->word,w);
        p->count=1;
        p->left=p->right=NULL;
    }
    else if((cond=strcmp(w,p->word))==0){
        p->count++;
    }
    else if(cond<0){
        p->left=treewords(p->left,w);
    }
    else
        p->right=treewords(p->right,w);
    return (p);
}
void treeprint(struct tnode *p)
{
    if(p!=NULL){
        treeprint(p->left);
        printf("%s %d\n",p->word,p->count);
        treeprint(p->right);
    }
}

展开
收起
杨冬芳 2016-05-27 10:57:53 2179 1
1 条回答
写回答
取消 提交回答
  • 统一词频时单词作为KEY, 次数作为VALUE
    这时楼主需要再来一棵树,遍历老树上所有数据,将词频作为KEY, 将单词作为VALUE,将数据插在新树上;
    然后再遍历新树,即可得到按词频排序的单词。

    2019-07-17 19:17:21
    赞同 1 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载