二叉排序樹 字典樹 樹中統計

樹種統計

隨着衛星成像技術的應用,自然資源研究機構可以識別每一棵樹的種類。請編寫程序幫助研究人員統計每種樹的數量,計算每種樹佔總數的百分比。首先輸入正整數N(≤105),隨後N行,每行給出衛星觀測到的一棵樹的種類名稱。種類名稱由不超過30個英文字母和空格組成(不區分大小寫)。按字典序遞增輸出各種樹的種類名稱及其所佔總數的百分比,其間以空格分隔,每種樹的信息佔一行。

  1. #include <cstdio>    
  2. #include <sstream>    
  3. #include <cstring>    
  4. #include <iostream>  
  5. #include <string>  
  6. #include <vector>  
  7. #include <algorithm>  
  8. #include <sstream>    
  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. 運行截圖 略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章