Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2790305
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-04-28 10:30:03

题意就是输入几组字符串,按照字典顺序输出,并且输出每个字符串在总字符串中的比例。由于题目中处理了大量的字符串,这里采用了二叉查找树(BST)来解决本题。
 
本题的具体过程是: 建立二叉查找树,向树中加入结点,其中每个结点有一个name,一个times(出现的次数),还有指向左孩子,右孩子的指针,向二叉查找树插入元素,如果没有该元素就加入,否则就对times加一,最后中序遍历,中序遍历的结果即是排好序的结果,同时输出占总数的百分比。

两种情况,直接从根结点插入(为空),从子结点插入(根结点不为空,子结点为空)

其实在插入时,先判断根结点是否为空
1、如果为空则直接生成一个新的结点,把数据插入()
2、如果不为空,则判断它的左子树是否为空,如果为空,则直接生成一个,把数据插入,
                                                                        如果不为空,则递归插入
      

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<iostream>
  4. #include<string>
  5. using namespace std;
  6. const int NameLen=40;
  7. long total;
  8. typedef char ElemType;//假定关键字类型为整数
  9. typedef struct node
  10. {
  11.     ElemType name[NameLen];
  12.     int count;
  13.     struct node * left,* right;
  14. } BSTNode;


  15. void insert(BSTNode *&root,ElemType * name) //注意这里为什么用指针的引用
  16. {
  17.     if(root==NULL) //如果该树为空,生成根结点count为1
  18.     {
  19.         root=(BSTNode*)malloc(sizeof(BSTNode));
  20.         strcpy(root->name,name);
  21.         root->count=1;
  22.         root->left=NULL;
  23.         root->right=NULL;
  24.     }
  25.     else
  26.        {
  27.         int cmp=strcmp(name,root->name);//name小于root为负
  28.         if(cmp == 0) //1、如果已经存在,则直接返回
  29.         {
  30.             (root->count)++;
  31.             return;
  32.         }
  33.         else if(cmp<0) //2、传入key小于根结点的权值
  34.              {
  35.                 if(root->left==NULL) //root的左孩子为空,则创建一个结点作为root的左孩子
  36.                 {
  37.                     BSTNode*p=(BSTNode *)malloc(sizeof(BSTNode));
  38.                     strcpy(p->name,name);
  39.                     p->count=1;
  40.                     p->left=NULL;
  41.                     p->right=NULL;
  42.                     root->left=p;//直接挂在它的左子树
  43.                 }
  44.                 else
  45.                     insert(root->left,name); //递归插入到左子树中
  46.             }
  47.         else                    //3、key大于根结点的权值
  48.         {
  49.             if(root->right==NULL) //root的右孩子为空,则创建一个结点作为root的右孩子
  50.             {
  51.                 BSTNode*p=(BSTNode *)malloc(sizeof(BSTNode));
  52.                 strcpy(p->name,name);
  53.                 p->count=1;
  54.                 p->left=NULL;
  55.                 p->right=NULL;
  56.                 root->right=p;
  57.             }
  58.             else
  59.                 insert(root->right,name); //递归插入到右子树中
  60.         }
  61.     }
  62. }

  63. void InorderTravel(BSTNode *root)
  64. {
  65.    if(root)
  66.    {
  67.     InorderTravel(root->left);
  68.     printf("%s %.4lf\n",root->name,root->count*100.0/total);
  69.     InorderTravel(root->right);
  70.    }
  71. }

  72. int main()
  73. {
  74.  char name[NameLen];
  75.  BSTNode * root=NULL;//root在输入第一次之后就不再是NULL了
  76.  while(gets(name) && name[0]!='\0')//不输入直接一个Enter,那个这个字符串相当'\0';
  77.  {
  78.   insert(root,name);
  79.   total++;
  80.  }
  81.      
  82.  InorderTravel(root);

  83. return 0;
  84. }

点击(此处)折叠或打开

  1. Sample Input

  2. Red Alder
  3. Ash
  4. Aspen
  5. Basswood
  6. Ash
  7. Beech
  8. Yellow Birch
  9. Ash
  10. Cherry
  11. Cottonwood
  12. Ash
  13. Cypress
  14. Red Elm
  15. Gum
  16. Hackberry
  17. White Oak
  18. Hickory
  19. Pecan
  20. Hard Maple
  21. White Oak
  22. Soft Maple
  23. Red Oak
  24. Red Oak
  25. White Oak
  26. Poplan
  27. Sassafras
  28. Sycamore
  29. Black Walnut
  30. Willow
  31. 以一空行结束
  32. Sample Output

  33. Ash 13.7931
  34. Aspen 3.4483
  35. Basswood 3.4483
  36. Beech 3.4483
  37. Black Walnut 3.4483
  38. Cherry 3.4483
  39. Cottonwood 3.4483
  40. Cypress 3.4483
  41. Gum 3.4483
  42. Hackberry 3.4483
  43. Hard Maple 3.4483
  44. Hickory 3.4483
  45. Pecan 3.4483
  46. Poplan 3.4483
  47. Red Alder 3.4483
  48. Red Elm 3.4483
  49. Red Oak 6.8966
  50. Sassafras 3.4483
  51. Soft Maple 3.4483
  52. Sycamore 3.4483
  53. White Oak 10.3448
  54. Willow 3.4483
  55. Yellow Birch 3.4483

阅读(1318) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~