当前位置:   article > 正文

平衡二叉树的使用_有一批学生信息,存储在文件stuinfo.txt中,学生信息的格式为: (学号(12位,关键字项

有一批学生信息,存储在文件stuinfo.txt中,学生信息的格式为: (学号(12位,关键字项

有一批学生信息,存储在文件stuinfo.txt中,学生信息的格式为:

(学号(12位,关键字项)、姓名、性别、班级、手机号(11位))

设计程序,要求实现下面功能:

(1)根据文件中的学生信息,生成一棵二叉排序树(同时保证是一棵AVL

树)。

(2)对二叉排序树作先序、中序和后序遍历并输出遍历结果(同时输出每

个结点的平衡因子)。

(3)查询二叉排序树中是否存在给定记录(按学号查询),并输出查询结

果,若不存在该记录,则插入该结点(数据的变化要反映到文件中,

插入和删除结点后仍要保证是一棵平衡二叉树)。

(4)删除指定学生记录(按学号删)。

(5)计算并输出该平衡二叉树的平均查找长度。

代码示例

  1. #include<iostream>
  2. #include<sstream>
  3. #include<fstream>
  4. #include<bits/stdc++.h>
  5. #define N 10
  6. using namespace std;
  7. typedef struct up{
  8. char num[20];//学号
  9. char name[20];//姓名
  10. char sex[20];//性别
  11. char clas[20];//班级
  12. char number[20];//电话号码
  13. }student;
  14. //二叉树
  15. typedef struct BstNode{
  16. student data;
  17. int bf;//节点的平衡因子
  18. struct BstNode *lchild;
  19. struct BstNode *rchild;
  20. }BSTNode,*BSTree;
  21. //线性表
  22. typedef struct{
  23. student* elem;
  24. int length;
  25. }SqList;
  26. void InitList(SqList &L){
  27. L.elem =new student[N];
  28. L.length =0;
  29. }
  30. //将文件中学生信息存储到线性表中
  31. void ReadData(SqList &str){
  32. int i=0;
  33. InitList(str);
  34. ifstream infile("C:\\Users\\郭顺志\\Desktop\\stuinfo.txt");//以输入的方式(读文件的方式)打开文件C:\\Users\\郭顺志\\Desktop\\stuinfo.txt
  35. while(!infile.eof()) //只要文件没读完,就读一行数据到顺序表L中的第i个分量中
  36. {
  37. infile>>str.elem [i].num; // 读一行中的学号信息,放入L.elem[i].num
  38. infile>>str.elem [i].name; // 读一行中的书名信息,放入L.elem[i].name
  39. infile>>str.elem [i].sex;// 读一行中的价格信息,放入L.elem[i].sex
  40. infile>>str.elem [i].clas;// 读一行中的价格信息,放入L.elem[i].clas
  41. infile>>str.elem [i].number;// 读一行中的价格信息,放入L.elem[i].number
  42. i++;
  43. }
  44. str.length =i; //修改顺序表L的长度
  45. infile.close(); //关闭文件
  46. system("pause");
  47. }
  48. /* 对以p为根的二叉排序树作右旋处理, */
  49. /* 处理之后p指向新的树根结点,即旋转处理之前的左子树的根结点 */
  50. void R_Rotate(BSTree* P)
  51. {
  52. BSTree L;
  53. L = (*P)->lchild; /* L指向P的左子树根结点 */
  54. (*P)->lchild = L->rchild; /* L的右子树挂接为P的左子树 */
  55. L->rchild = (*P);
  56. *P = L; /* P指向新的根结点 */
  57. }
  58. /* 对以P为根的二叉排序树作左旋处理, */
  59. /* 处理之后P指向新的树根结点,即旋转处理之前的右子树的根结点0 */
  60. void L_Rotate(BSTree* P)
  61. {
  62. BSTree R;
  63. R = (*P)->rchild; /* R指向P的右子树根结点 */
  64. (*P)->rchild = R->lchild; /* R的左子树挂接为P的右子树 */
  65. R->lchild = (*P);
  66. *P = R; /* P指向新的根结点 */
  67. }
  68. /* 对以指针T所指结点为根的二叉树作左平衡旋转处理 */
  69. /* 本算法结束时,指针T指向新的根结点 */
  70. void LeftBalance(BSTree* T)
  71. {
  72. BSTree L, Lr;
  73. L = (*T)->lchild; /* L指向T的左子树根结点 */
  74. switch (L->bf)
  75. { /* 检查T的左子树的平衡度,并作相应平衡处理 */
  76. case 1: /* 新结点插入在T的左孩子的左子树上,要作单右旋处理 */
  77. (*T)->bf = L->bf =0;
  78. R_Rotate(T);
  79. break;
  80. case -1: /* 新结点插入在T的左孩子的右子树上,要作双旋处理 */
  81. Lr = L-&
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/766337
推荐阅读
相关标签
  

闽ICP备14008679号