• Contest2850 - 【在线编程平台】2022年计算机类数据结构作业12.20221201-1206


    目录

    问题 A: 二叉排序树 - 文本输出

    问题 B: 销售排行榜 

    问题 C: 二叉排序树-平衡因子 

    问题 D: 案例 1-1.1 二分查找

    问题 E: 进阶实验 1-3.1:两个有序序列的中位数


    问题 A: 二叉排序树 - 文本输出

    题目描述

    给定一个序列,使用该序列生成二叉排序树(也叫二叉搜索树,BST),然后以本题规定方法输出该二叉排序树。
    例:
    给定一个序列:43 25 29 67 17 88 54 47 35 62
    以第一个数字43)为根节点,然后将后面的数字依输入次序逐个添加至该树中,得到一个二叉排序树,如下图所示。


    然后先序遍历上面这个树,并按行输出数字。
    其中每个子节点的输出前,需要相较于其父节点前多四个普通空格。
    当某个节点为叶子节点(即无子节点),则该节点的左右叶子节点均不用输出。
    而当某个节点仅有左叶子节点或右叶子节点时,另一个空缺的子节点用#占位。


    以该图为例,其最终输出结果为:
    43
        25
            17
            29
                #
                35
        67
            54
                47
                62
            88

    输入格式

    第一行为正整数n,表示接下来将输入的节点数量。(n<500)
    第二行为n个正整数,每个数字以空格分隔(以第一个数字为根节点)

    输出格式

    以题目描述中的方法输出得到的二叉排序树。
    以第一个数字为根节点,然后将后面的数字依输入次序逐个添加至该树中,得到一个二叉排序树。
    然后先序遍历该树,并按行输出数字。
    其中每个子节点的输出前,需要相较于其父节点前多四个普通空格。
    当某个节点为叶子节点(即无子节点),则该节点的左右叶子节点均不用输出。
    而当某个节点仅有左叶子节点或右叶子节点时,另一个空缺的子节点用#占位。
     

    输入样例 复制

    1. 10
    2. 43 25 29 67 17 88 54 47 35 62

    输出样例 复制

    1. 43
    2. 25
    3. 17
    4. 29
    5. #
    6. 35
    7. 67
    8. 54
    9. 47
    10. 62
    11. 88
    1. #include
    2. using namespace std;
    3. typedef struct node{
    4. int data;
    5. node *rchild;
    6. node *lchild;
    7. }Node,*Tree;
    8. void creat(Tree &tree,int num)
    9. {
    10. Tree node = new Node;
    11. node->data=num;
    12. node->lchild=NULL;
    13. node->rchild=NULL;
    14. if(tree==NULL)
    15. {
    16. tree=node;
    17. }
    18. else if(num>tree->data)
    19. {
    20. creat(tree->rchild,num);
    21. }
    22. else
    23. {
    24. creat(tree->lchild,num);
    25. }
    26. }
    27. void print(Tree tree,int i)
    28. {
    29. if(tree==NULL)
    30. return;
    31. for(int j=0;j
    32. cout<<" ";
    33. cout<data<
    34. i++;
    35. if(tree->lchild==NULL&&tree->rchild!=NULL)
    36. {
    37. for(int j=0;j
    38. cout<<" ";
    39. cout<<"#"<
    40. }
    41. print(tree->lchild,i);
    42. print(tree->rchild,i);
    43. if(tree->lchild!=NULL&&tree->rchild==NULL)
    44. {
    45. for(int j=0;j
    46. cout<<" ";
    47. cout<<"#"<
    48. }
    49. }
    50. int main()
    51. {
    52. int n;
    53. cin>>n;
    54. int a[505];
    55. Tree tree;
    56. tree=new Node;
    57. tree=NULL;
    58. for(int i=0;i
    59. {
    60. cin>>a[i];
    61. }
    62. for(int i=0;i
    63. {
    64. creat(tree,a[i]);
    65. }
    66. print(tree,0);
    67. return 0;
    68. }

    问题 B: 销售排行榜 

    题目描述

    你的任务是帮助淘宝网店店长整理销售数据,根据累计的销售记录,将所有商品按销售数量降序排列。

    输入格式

    输入包括多行数据(行数小于100000),每行数据包括4个信息,分别是商品名称、销售数量、单价、成交日期

    商品名称由小写字母组成,且不超过100个字符,销售数量和单价都是正整数,且小于10000

    输出格式

    输出包括多行数据,将所有在输入中出现的商品按销售数量降序排列,每行数据包括3个信息,分别是商品名称、销售数量、销售额,如果两种商品销售数量一样,则按商品的字母顺序升序排列

    输入样例 复制

    1. apple 1 20 2014-4-2
    2. basketball 1 20 2014-4-2
    3. computer 1 20 2014-4-2
    4. shoe 1 20 2014-4-2
    5. tv 1 20 2014-4-2
    6. apple 1 18 2014-4-3

    输出样例 复制

    1. apple 2 38
    2. basketball 1 20
    3. computer 1 20
    4. shoe 1 20
    5. tv 1 20
    1. #include
    2. using namespace std;
    3. struct info{
    4. string name;
    5. int num;
    6. int price;
    7. int flag=1;
    8. int all=0;
    9. }a[100005];
    10. bool mysort1(struct info c,struct info d)
    11. {
    12. return c.name
    13. }
    14. bool mysort2(struct info c,struct info d)
    15. {
    16. if(c.num==d.num)
    17. return c.name
    18. else
    19. return c.num>d.num;
    20. }
    21. int main()
    22. {
    23. string name;
    24. int num;
    25. int price;
    26. string date;
    27. int index=0;
    28. while(cin>>name>>num>>price>>date)
    29. {
    30. a[index].price=price;
    31. a[index].name=name;
    32. a[index].num=num;
    33. a[index].all=num*price;
    34. index++;
    35. // if(index==6)
    36. // break;
    37. }
    38. sort(a,a+index,mysort1);
    39. for(int i=1;i
    40. {
    41. if(a[i].name==a[i-1].name)
    42. {
    43. a[i-1].flag=0;
    44. a[i].num+=a[i-1].num;
    45. a[i].all+=a[i-1].all;
    46. }
    47. }
    48. sort(a,a+index,mysort2);
    49. for(int i=0;i
    50. {
    51. if(a[i].flag==1)
    52. cout<" "<" "<
    53. }
    54. }

    问题 C: 二叉排序树-平衡因子 

    题目描述

    给定一个序列,使用该序列生成二叉排序树,然后以本题规定方法输出该二叉排序树。
    例:
    给定一个序列:43 25 29 67 17 88 54 47 35 62
    以第一个数字(43)为根节点,然后将后面的数字依输入次序逐个添加至该树中,得到一个二叉排序树

    然后先序遍历上面这个树,并按行输出数字。
    其中每个子节点的输出前,需要相较于其父节点前多四个普通空格。
    当某个节点为叶子节点(即无子节点),则该节点的左右叶子节点均不用输出。
    而当某个节点仅有左叶子节点或右叶子节点时,另一个空缺的子节点用#占位。
    对于非空的节点,求出其平衡因子,并用括号括起来输出在结果中
    以该图为例,其最终输出结果为:
    43(0)
        25(-1)
            17(0)
            29(-1)
                #
                35(0)
        67(1)
            54(0)
                47(0)
                62(0)
            88(0)

    输入样例 复制

    1. 10
    2. 43 25 29 67 17 88 54 47 35 62

    输出样例 复制

    1. 43(0)​
    2. 25(-1)
    3. 17(0)
    4. 29(-1)
    5. #
    6. 35(0)
    7. 67(1)
    8. 54(0)
    9. 47(0)
    10. 62(0)
    11. 88(0)
    1. #include
    2. using namespace std;
    3. typedef struct node{
    4. int data;
    5. int height=0;
    6. node *rchild;
    7. node *lchild;
    8. }Node,*Tree;
    9. int depth=0;
    10. int height(Tree &t)
    11. {
    12. if(t==NULL)
    13. return 0;
    14. t->height=max(height(t->lchild),height(t->rchild))+1;
    15. return t->height;
    16. }
    17. void creat(Tree &tree,int num)
    18. {
    19. Tree node = new Node;
    20. node->data=num;
    21. node->lchild=NULL;
    22. node->rchild=NULL;
    23. if(tree==NULL)
    24. {
    25. tree=node;
    26. }
    27. else if(num>tree->data)
    28. {
    29. creat(tree->rchild,num);
    30. }
    31. else
    32. {
    33. creat(tree->lchild,num);
    34. }
    35. }
    36. void print(Tree tree,int i)
    37. {
    38. if(tree==NULL)
    39. return;
    40. for(int j=0;j
    41. cout<<" ";
    42. cout<data;
    43. if(tree->lchild==NULL&&tree->rchild==NULL)
    44. cout<<"("<<0<<")"<
    45. else if(tree->lchild==NULL&&tree->rchild!=NULL)
    46. cout<<"("<rchild->height*-1<<")"<
    47. else if(tree->lchild!=NULL&&tree->rchild==NULL)
    48. cout<<"("<lchild->height<<")"<
    49. else
    50. cout<<"("<lchild->height-tree->rchild->height<<")"<
    51. i++;
    52. if(tree->lchild==NULL&&tree->rchild!=NULL)
    53. {
    54. for(int j=0;j
    55. cout<<" ";
    56. cout<<"#"<
    57. }
    58. print(tree->lchild,i);
    59. print(tree->rchild,i);
    60. if(tree->lchild!=NULL&&tree->rchild==NULL)
    61. {
    62. for(int j=0;j
    63. cout<<" ";
    64. cout<<"#"<
    65. }
    66. }
    67. int main()
    68. {
    69. int n;
    70. cin>>n;
    71. int a[505];
    72. Tree tree;
    73. tree=new Node;
    74. tree=NULL;
    75. for(int i=0;i
    76. {
    77. cin>>a[i];
    78. }
    79. for(int i=0;i
    80. {
    81. creat(tree,a[i]);
    82. }
    83. height(tree);
    84. print(tree,0);
    85. return 0;
    86. }

    问题 D: 案例 1-1.1 二分查找

    题目描述

      给定大小为N(0

    输入格式

    第一行 数组大小 N
    第二行 数组A[]
    第三行 带查找的整数X

    输出格式

    如找到X,则输出第一次出现的位置。如未找到,则输出-1。

    输入样例 复制

    1. 5
    2. 1 2 4 4 5
    3. 4

    输出样例 复制

    3
    1. #include
    2. using namespace std;
    3. int a[1005];
    4. int main()
    5. {
    6. int n;
    7. cin>>n;
    8. int t;
    9. for(int i=0;i
    10. {
    11. cin>>a[i];
    12. }
    13. cin>>t;
    14. for(int i=0;i
    15. {
    16. if(a[i]==t)
    17. {
    18. cout<1;
    19. return 0;
    20. }
    21. }
    22. cout<<-1;
    23. }

    问题 E: 进阶实验 1-3.1:两个有序序列的中位数

    题目描述

        已知有两个等长非降序序列S1,S2。先将S1,S2合并为S3,求S3的中位数。长度为N的非降序序列SN的中位数为第X个数,X=不超过(N+1)/2的最大整数。

    输入格式

    第一行,序列S1,S2的长度N
    第二行,序列S1的N个整数
    第三行,序列S2的N个整数

    输出格式

    输出两个序列合并后序列S3的中位数

    输入样例 复制

    1. 5
    2. 1 3 5 7 9
    3. 2 3 4 5 6

    输出样例 复制

    4
    1. //这里耍了个小聪明,没有合并,不要学我
    2. #include
    3. using namespace std;
    4. int a[10005];
    5. int b[10005];
    6. int main()
    7. {
    8. int n;
    9. int index=0;
    10. cin>>n;
    11. for(int i=0;i
    12. cin>>a[i];
    13. for(int i=0;i
    14. cin>>b[i];
    15. int i=0,j=0;
    16. while(1)
    17. {
    18. int temp=0;
    19. if(a[i]<=b[j])
    20. {
    21. temp=a[i];
    22. i++;
    23. }
    24. else
    25. {
    26. temp=b[j];
    27. j++;
    28. }
    29. index++;
    30. if(index==n)
    31. {
    32. cout<
    33. return 0;
    34. }
    35. }
    36. return 0;
    37. }

  • 相关阅读:
    超详细Docker部署SpringBoot+Vue项目(三更博客项目部署)
    Spring Boot 整合Redis实现消息发布与订阅
    csp-202206
    Java 7 生命周期结束
    腾讯地图开发填坑总结
    Java后端小伙两周斩获字节2-2offer 面经总结
    pandas学习(三) grouping
    基于Doris构建亿级数据实时数据分析系统
    Spring Cloud Feign实战
    GIS之深度学习03:Anaconda无法正常启动问题汇总(更新)
  • 原文地址:https://blog.csdn.net/weixin_61133168/article/details/128196134