二叉排序树(字符串统计)

数据结构实验的东西:

1、统计字符串中字符出现的次数
编写一个程序,由键盘输入一个字符串,统计该字符串中出现的字符及其次数。然后输出结果。要求用一个二叉树来保存处理结果,字符串中每个不同的字符用树的结点表示,结点应该包含四个域:该字符、该字符出现的次数、左子树指针、右子树指针;其中左子树的字符的ASCII码均小于该字符,右子树的字符的ASCII码均大于该字符。
 
提示:
ü         从字符串中依次读取字符,在二叉树中查找该字符是否存在。
ü         如果存在,则该字符的出现次数加1;如果不存在,则按照二叉排序树的要求插入该字符结点,同时设置出现次数为1。
ü         全部字符读完以后,调用二叉树的中序遍历,有序的输出每个字符及其出现的次数。
 
 
 
Code:
  1. /**  
  2.  * Author: XadillaX  
  3.  * Data: 2010-12-27  
  4.  */  
  5. #include    
  6. using namespace std;   
  7.   
  8. struct BSTreeCH {   
  9.     char ch;   
  10.     int time;   
  11.     BSTreeCH *lc, *rc;   
  12.        
  13.     /** 构造函数 */  
  14.     BSTreeCH(char _ch)   
  15.     {   
  16.         lc = rc = NULL;   
  17.         ch = _ch;   
  18.         time = 1;   
  19.     }   
  20. };   
  21.   
  22. /**  
  23.  * @brief 对字符统计二叉树插入节点  
  24.  */  
  25. void InsertBST_CH(BSTreeCH *t, char ch)   
  26. {   
  27.     /** 若已存在 */  
  28.     if(ch == t->ch)   
  29.     {   
  30.         t->time++;   
  31.         return;   
  32.     }   
  33.   
  34.     /** 直接插入或者递归插入 */  
  35.     if(ch < t->ch && NULL == t->lc) t->lc = new BSTreeCH(ch);   
  36.     else  
  37.     if(ch > t->ch && NULL == t->rc) t->rc = new BSTreeCH(ch);   
  38.     else  
  39.     if(ch < t->ch) InsertBST_CH(t->lc, ch);   
  40.     else  
  41.     if(ch > t->ch) InsertBST_CH(t->rc, ch);   
  42. }   
  43.   
  44. /**  
  45.  * @brief 删除字符统计二叉树  
  46.  */  
  47. void DelBST_CH(BSTreeCH *t)   
  48. {   
  49.     if(NULL != t->lc) DelBST_CH(t->lc);   
  50.     if(NULL != t->rc) DelBST_CH(t->rc);   
  51.   
  52.     delete t;   
  53. }   
  54.   
  55. /**  
  56.  * @brief 中序遍历字符统计二叉树  
  57.  */  
  58. void TraBST_CH(BSTreeCH *t)   
  59. {   
  60.     if(NULL != t->lc) TraBST_CH(t->lc);   
  61.     printf("'%c'(%4d): %4d/n", t->ch, t->ch, t->time);   
  62.     if(NULL != t->rc) TraBST_CH(t->rc);   
  63. }   
  64.   
  65. /**  
  66.  * @brief 统计字符  
  67.  */  
  68. void BST_CH()   
  69. {   
  70.     FILE *fp;   
  71.     BSTreeCH *root = NULL;   
  72.   
  73.     if(NULL == (fp = fopen("a.txt""r")))   
  74.     {   
  75.         printf("Error on opening file./n");   
  76.         return;   
  77.     }   
  78.   
  79.     /** 读文件 */  
  80.     while(!feof(fp))   
  81.     {   
  82.         char ch;   
  83.         ch = fgetc(fp);   
  84.         if(-1 == ch) break;   
  85.   
  86.         /** 建根 */  
  87.         if(NULL == root)   
  88.         {   
  89.             root = new BSTreeCH(ch);   
  90.             continue;   
  91.         }   
  92.   
  93.         /** 插入 */  
  94.         InsertBST_CH(root, ch);   
  95.     }   
  96.   
  97.     fclose(fp);                                 ///< 关闭文件   
  98.   
  99.     TraBST_CH(root);                            ///< 遍历树   
  100.     DelBST_CH(root);                            ///< 删除树   
  101.     root = NULL;   
  102. }   
  103.   
  104. int main()   
  105. {   
  106.     BST_CH();   
  107.   
  108.     return 0;   
  109. }   

 

你可能感兴趣的:(二叉排序树(字符串统计))