您的位置:首页 > 其它

二叉排序树 字典树 树中统计

2016-06-09 21:42 176 查看
树种统计
随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。首先输入正整数N(≤105),随后N行,每行给出卫星观测到的一棵树的种类名称。种类名称由不超过30个英文字母和空格组成(不区分大小写)。按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,每种树的信息占一行。

#include <cstdio>    

#include <sstream>    

#include <cstring>    

#include <iostream>  

#include <string>  

#include <vector>  

#include <algorithm>  

#include <sstream>    

using namespace std;
   

#define N 35 

  

int n ;  

  

typedef struct node{  

    char s
 ;  

    int cnt ;  

    struct node *left , *right ;  

    node(char _s[] = "" , int _cnt = 0)//
这个是 c++中的构造函数在new一个节点的时候给他里面的成员变量就行赋值。

    {  

        strcpy(s,_s);  

        cnt = _cnt;   

        left = NULL ;  

        right = NULL ;  

    }  

}Bnode ;  

  

void inOrder(Bnode* root)  

{  

    if(root != NULL )  

    {  

        inOrder(root->left) ;  

        printf("%s %.4lf%%\n" ,root->s , root->cnt * 100.0 / n ) ;  

        inOrder(root->right) ;   

    }  

}  

  

Bnode* createTree(Bnode* root , char s[])  

{  

    if(root == NULL)  

        root = new node(s,1);
  //  创建一个的节点并初始化

    else{  

        int cmp = strcmp(s , root->s);  

        if(cmp < 0)  

        {  

            root->left = createTree(root->left , s) ;  // 相当于一个二叉树的遍历吧,

        }else if(cmp > 0){  

            root->right = createTree(root->right , s) ;  

        }else{  

            root->cnt = root->cnt + 1 ; //  相同的就直接那个节点就里的一个int 类型的计数器加1.

        }  

    }  

    return root ;
 每次返回一个root节点

}  

  

int main()  

{  

    //freopen("in.txt", "r", stdin);  

    scanf("%d\n",&n);  

    int i ;  

    char s
 ;  

    Bnode* root = NULL ;  

    for(i = 0 ;i < n; i++)  

    {  

        gets(s) ;  

        root = createTree(root , s);  // 这个是根节点,每次都是相同的一个。在create函数中一步一步的递归后他他不变,只不过子树变化了。

    }  

    inOrder(root);  

    return 0 ;  

}  

运行截图 略
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: