• 数据结构有关树的练习题目


                                     |
                                     |
               /---------------------2:1.58 1-------------------------\
               |                                                      |
               |                                                      |
    /----------4:1.81 0---\                     /---------------------9:1.75 0---\
    |                     |                     |                                |
    |                     |                     |                                |
    8:1.74 0              5:1.68 0              1:1.64 1---\                     6:1.72 1
                                                           |
                                                           |
                                                           7:1.55 1

    先序遍历序列:
    2 1.58 1
    4 1.81 0
    8 1.74 0
    5 1.68 0
    9 1.75 0
    1 1.64 1
    7 1.55 1
    6 1.72 1

    每位同学的身高增加0.1后的二叉树:
                                     |
                                     |
               /---------------------2:1.68 1-------------------------\
               |                                                      |
               |                                                      |
    /----------4:1.91 0---\                     /---------------------9:1.85 0---\
    |                     |                     |                                |
    |                     |                     |                                |
    8:1.84 0              5:1.78 0              1:1.74 1---\                     6:1.82 1
                                                           |
                                                           |
                                                           7:1.65 1


    交换左右子树后的二叉树:
                                                |
                                                |
               /--------------------------------2:1.68 1--------------\
               |                                                      |
               |                                                      |
    /----------9:1.85 0--------------\        

    1. //records.txt
    2. 2 1.58 1
    3. 4 1.81 0
    4. 8 1.74 0
    5. 0
    6. 0
    7. 5 1.68 0
    8. 0
    9. 0
    10. 9 1.75 0
    11. 1 1.64 1
    12. 0
    13. 7 1.55 1
    14. 0
    15. 0
    16. 6 1.72 1
    17. 0
    18. 0

    1. #include
    2. #include
    3. #include
    4. typedef struct {
    5. int xh; /*学号*/
    6. float sg; /*身高*/
    7. int sex; /*性别,0为男生,1为女生*/
    8. } datatype;
    9. typedef struct node{
    10. datatype data;
    11. struct node *left,*right;
    12. } BiNode,*BiTree;
    13. //以下函数声明为二叉树显示,不要求掌握
    14. #define NODE_WIDTH 11
    15. #define NODE_HEIGHT 3
    16. BiNode* createTree();
    17. BiNode* createTree2(FILE *fp);
    18. void show_tree(BiTree bt);
    19. void showBuf(char x[][500],int m, int n);
    20. void printInBuf(BiTree bt, char buf[][500], int x, int y);
    21. int getWidth(BiTree bt);
    22. int getHeight(BiTree bt);
    23. //以下为二叉树显示,不要求掌握
    24. void show_tree(BiTree bt)
    25. {
    26. char buf[50][500];
    27. int m=50,n=500,i,j; //以二维数组的方式存储二叉树,行m,列n,字符串长度10
    28. for (i=0; i
    29. for (j=0; j
    30. buf[i][j]=0;
    31. m=getHeight(bt)*NODE_HEIGHT;
    32. n=getWidth(bt)*NODE_WIDTH;
    33. printInBuf(bt,buf,0,0);
    34. showBuf(buf,m,n);
    35. printf("\n");
    36. }
    37. void showBuf(char x[][500],int m,int n)
    38. {
    39. int i,j;
    40. for (i=0; i
    41. {
    42. for (j=0; j
    43. printf("%c",x[i][j]=='\0'?' ':x[i][j]);
    44. printf("\n");
    45. }
    46. }
    47. void printInBuf(BiTree bt, char buf[][500], int x, int y)
    48. {
    49. int pl,pr,rootpos,i;
    50. char sv[500];
    51. char tempsg[5],tempsex[5];
    52. sprintf(sv,"%d:",bt->data.xh);
    53. sprintf(tempsg,"%.2f",bt->data.sg);
    54. sprintf(tempsex,"%d",bt->data.sex);
    55. strcat(sv,tempsg);
    56. strcat(sv," ");
    57. strcat(sv,tempsex);
    58. if (bt->left==NULL)
    59. pl=0;
    60. else
    61. {
    62. pl=NODE_WIDTH;
    63. if (bt->left->right!=NULL)
    64. pl+=getWidth(bt->left->right)*NODE_WIDTH;
    65. }
    66. if (bt->right==NULL)
    67. pr=0;
    68. else
    69. {
    70. pr=NODE_WIDTH;
    71. if (bt->right->left!=NULL)
    72. pr+=getWidth(bt->right->left)*NODE_WIDTH;
    73. }
    74. rootpos=x;
    75. if (bt->left!=NULL)
    76. rootpos+=getWidth(bt->left)*NODE_WIDTH;
    77. for (i=0; i
    78. buf[y+i][rootpos]='|';
    79. for (i=rootpos-pl; i<=rootpos+pr; i++)
    80. buf[y+NODE_HEIGHT-1][i]='-';
    81. for (i=rootpos; istrlen(sv); i++)
    82. buf[y+NODE_HEIGHT-1][i]=sv[i-rootpos];
    83. if (pl>0)
    84. buf[y+NODE_HEIGHT-1][rootpos-pl]='/';
    85. if (pr>0)
    86. buf[y+NODE_HEIGHT-1][rootpos+pr]='\\';
    87. if (bt->left!=NULL)
    88. printInBuf(bt->left,buf,x,y+NODE_HEIGHT);
    89. if (bt->right!=NULL)
    90. printInBuf(bt->right,buf,rootpos+NODE_WIDTH,y+NODE_HEIGHT);
    91. }
    92. int getWidth(BiTree bt)
    93. {
    94. int w=1;
    95. if (bt==NULL)
    96. return 0;
    97. w += getWidth(bt->left);
    98. w += getWidth(bt->right);
    99. return w;
    100. }
    101. int getHeight(BiTree bt)
    102. {
    103. int h=1,l,r;
    104. if (bt==NULL)
    105. return 0;
    106. l = getHeight(bt->left);
    107. r = getHeight(bt->right);
    108. h += l>r ? l : r;
    109. return h;
    110. }
    111. BiNode* createTree()
    112. {
    113. BiNode* T;
    114. FILE *fp;
    115. if((fp=fopen("records.txt","r"))==NULL)
    116. {
    117. printf("can not open read file !");
    118. exit(1) ;
    119. }
    120. while(!feof(fp))
    121. {
    122. T = createTree2(fp);
    123. }
    124. fclose(fp);
    125. return T;
    126. }
    127. BiNode* createTree2(FILE *fp)
    128. {
    129. BiNode* T;
    130. datatype stu;
    131. fscanf(fp,"%d",&stu.xh);
    132. if (stu.xh==0)
    133. return NULL;
    134. fscanf(fp,"%f%d",&stu.sg,&stu.sex);
    135. T=(BiNode*)malloc(sizeof(BiNode)); /*生成二叉树的根结点*/
    136. T->data=stu;
    137. T->left=createTree2(fp); /*递归实现左子树的建立*/
    138. T->right=createTree2(fp); /*递归实现右子树的建立*/
    139. return T;
    140. }

    1. #define _CRT_SECURE_NO_WARNINGS
    2. /*
    3. 1.题目要求
    4. 阅读程序文件sy3.c,调用bitree2.c提供的功能函数(以#include " bitree2.c" 方式导入函数库),从数据文件records.txt中读取学生信息,建立学生信息二叉树并打印在屏幕上。调用自定义的函数完成以下操作:
    5. 先序遍历二叉树;
    6. 将二叉树中所有学生的身高增加0.1;
    7. 二叉树中所有结点的左右子树交换;
    8. 统计二叉树中度为1的结点个数;
    9. 统计二叉树中身高达标人数;
    10. 统计二叉树的深度;
    11. 在程序文件sy3.c中需再定义以下6个功能函数:*/
    12. //(1)void preOrder(BiNode * T); /*前序遍历*/
    13. //(2)void changeHeight(BiNode* T); /*每位同学的身高+0.1*/
    14. //(3)void exchange(BiNode* T); /*二叉树左右子树交换*/
    15. //(4)int oneChild(BiNode* T); /*求度为1结点数,并返回*/
    16. //(5)int count(BiNode* T, float sg); /*求身高高于 sg变量的结点数,并返回*/
    17. //(6)int deep(BiNode* T); /*求二叉树深度*/
    18. //2.请根据题目功能要求或程序中的注释完成sy3.c代码
    19. #include "bitree2.h"
    20. void preOrder(BiNode* T); /*前序遍历*/
    21. void changeHeight(BiNode* T); /*每位同学的身高+0.1*/
    22. void exchange(BiNode* T); /*二叉树左右子树交换*/
    23. int oneChild(BiNode* T); /*求度为1结点数,并返回*/
    24. int count(BiNode* T, float sg); /*求身高高于 sg变量的结点数,并返回*/
    25. int deep(BiNode* T); /*求二叉树深度*/
    26. int main()
    27. {
    28. BiNode* root, * tmp;
    29. root = createTree(); /*利用二叉树前序遍历的结果建成一棵二叉树*/
    30. show_tree(root); /*二叉树的显示,不要求掌握*/
    31. printf("先序遍历序列:\n");
    32. preOrder(root);
    33. printf("\n每位同学的身高增加0.1后的二叉树:\n");
    34. changeHeight(root);
    35. show_tree(root);/*二叉树的显示,不要求掌握*/
    36. printf("\n交换左右子树后的二叉树:\n");
    37. exchange(root); /*交换二叉树的左右子树*/
    38. show_tree(root);/*二叉树的显示,不要求掌握*/
    39. printf("\n度为1结点数=%d", oneChild(root));
    40. printf("\n身高高于1.67的结点数=%d", count(root, 1.67));
    41. printf("\n树的深度=%d", deep(root));
    42. return 0;
    43. }
    44. /*前序遍历*/
    45. void preOrder(BiNode* T)
    46. {
    47. if (T)
    48. {
    49. printf("%d %.2f %d\n", T->data.xh, T->data.sg, T->data.sex); /*打印结点*/
    50. preOrder(T->left);
    51. preOrder(T->right);
    52. }
    53. }
    54. /*每位同学的身高增加0.1*/
    55. void changeHeight(BiNode* T)
    56. {
    57. if (T)
    58. {
    59. T->data.sg += 0.1;
    60. changeHeight(T->left);
    61. changeHeight(T->right);
    62. }
    63. }
    64. /*二叉树左右子树交换*/
    65. void exchange(BiNode* T)
    66. {
    67. BiNode* tmp;
    68. if (T)
    69. {
    70. BiTree tmp = T->left;
    71. T->left = T->right;
    72. T->right = tmp;
    73. exchange(T->left);
    74. exchange(T->right);
    75. }
    76. }
    77. /*求度为1结点数*/
    78. int oneChild(BiNode* T)
    79. {
    80. if (!T)
    81. {
    82. return 0;
    83. }
    84. else if ((T->left == NULL && T->right != NULL) || (T->left != NULL && T->right == NULL))
    85. {
    86. return oneChild(T->left) + oneChild(T->right) + 1;
    87. }
    88. else
    89. {
    90. return oneChild(T->left) + oneChild(T->right);
    91. }
    92. }
    93. /*求身高高于 sg变量的结点数,并返回*/
    94. int count(BiNode* T, float sg)
    95. {
    96. if (!T)
    97. {
    98. return 0;
    99. }
    100. else
    101. {
    102. if (T->data.sg > sg)
    103. {
    104. return count(T->left, sg) + count(T->right, sg) + 1;
    105. }
    106. else
    107. {
    108. return count(T->left, sg) + count(T->right, sg);
    109. }
    110. }
    111. }
    112. /*求二叉树深度*/
    113. int deep(BiNode* T)
    114. {
    115. if (!T)
    116. {
    117. return 0;
    118. }
    119. else
    120. {
    121. int left = deep(T->left);
    122. int right = deep(T->right);
    123. return (left >= right ? left : right) + 1;
    124. }
    125. }

  • 相关阅读:
    [附源码]Python计算机毕业设计Django家庭医生签约服务管理系统
    python一行命令搭建web服务,实现内网共享文件
    Docker项目部署
    【开题报告】基于微信小程序的高校党支部党务管理的系统设计与实现
    算法设计与分析100例子(C语言版)
    基于分水岭分割算法的CT图像智能诊断研究-含Matlab代码
    英特尔 Linux Vulkan 驱动程序的首席开发人员离职;JDK 18 功能集被冻结,进入 Rampdown 第一阶段;Ubuntu 禁用 os-prober | 开源日报
    Mac文件搜索工具HoudahSpot 6.4.1中文版
    银行人总结5个影响系统性能的因素,怕是很多人都会忽略
    海丝一号-中国-2020
  • 原文地址:https://blog.csdn.net/laocooon/article/details/127780706