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

树种统计

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

  1. #include     
  2. #include     
  3. #include     
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include     
  9. using namespace std;    
  10. #define N 35 
  11.   
  12. int n ;  
  13.   
  14. typedef struct node{  
  15.     char s[N] ;  
  16.     int cnt ;  
  17.     struct node *left , *right ;  
  18.     node(char _s[] = "" , int _cnt = 0)// 这个是 c++中的构造函数在new一个节点的时候给他里面的成员变量就行赋值。
  19.     {  
  20.         strcpy(s,_s);  
  21.         cnt = _cnt;   
  22.         left = NULL ;  
  23.         right = NULL ;  
  24.     }  
  25. }Bnode ;  
  26.   
  27. void inOrder(Bnode* root)  
  28. {  
  29.     if(root != NULL )  
  30.     {  
  31.         inOrder(root->left) ;  
  32.         printf("%s %.4lf%%\n" ,root->s , root->cnt * 100.0 / n ) ;  
  33.         inOrder(root->right) ;   
  34.     }  
  35. }  
  36.   
  37. Bnode* createTree(Bnode* root , char s[])  
  38. {  
  39.     if(root == NULL)  
  40.         root = new node(s,1);   //  创建一个的节点并初始化
  41.     else{  
  42.         int cmp = strcmp(s , root->s);  
  43.         if(cmp < 0)  
  44.         {  
  45.             root->left = createTree(root->left , s) ;  // 相当于一个二叉树的遍历吧,
  46.         }else if(cmp > 0){  
  47.             root->right = createTree(root->right , s) ;  
  48.         }else{  
  49.             root->cnt = root->cnt + 1 ; //  相同的就直接那个节点就里的一个int 类型的计数器加1.
  50.         }  
  51.     }  
  52.     return root ;  每次返回一个root节点
  53. }  
  54.   
  55. int main()  
  56. {  
  57.     //freopen("in.txt", "r", stdin);  
  58.     scanf("%d\n",&n);  
  59.     int i ;  
  60.     char s[N] ;  
  61.     Bnode* root = NULL ;  
  62.     for(i = 0 ;i < n; i++)  
  63.     {  
  64.         gets(s) ;  
  65.         root = createTree(root , s);  // 这个是根节点,每次都是相同的一个。在create函数中一步一步的递归后他他不变,只不过子树变化了。
  66.     }  
  67.     inOrder(root);  
  68.     return 0 ;  
  69. }  
  70. 运行截图 略

你可能感兴趣的:(数据结构,算法)