1、综合性实验报告和完整代码华南农业大学信息学院 综合性、设计性实验 起止日期:2011秋学院专业班级学号姓名实验题目实现平衡二叉排序树的各种算法自我评价项 目算法设计独立完成情况算法熟练程度测试通过成功失败独立帮助掌握了解不懂插入新结点AAAA前序、中序、后序遍历二叉树(递归)AAAA前序、中序、后序遍历的非递归算法AAAA层次遍历二叉树AAAA在二叉树中查找给定关键字AAAA交换各结点的左右子树AAAA求二叉树的深度AAAA叶子结点数AAAA删除某结点AAAA A-完成实验要求的全部功能并运行通过,算法有一定的新意,程序代码符合书写规范,实验报告叙述清晰完整,有详尽的分析和总结。 B-完成实验
2、要求的全部功能,程序代码符合书写规范,实验报告叙述 清晰完整。 C-完成实验要求的大部分功能,实验报告良好。 D-未按时完成实验,或者抄袭。成绩 教师签名:实现平衡二叉排序树的各种算法实验报告班级:姓名:学号:完成日期: 一、 分析题目要求用函数实现如下平衡二叉排序树算法,:(1) 插入新结点 (2) 前序、中序、后序遍历二叉树 (递归)(3) 前序、中序、后序遍历的非递归算法 (4) 层次遍历二叉树 (5) 在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6) 交换各结点的左右子树 (7) 求二叉树的深度 (8) 叶子结点数(9) 删除某结点为了完成以上的各项操作,首先应该用函数建
3、一棵平衡二叉排序树,输入形式是首先输入要建的二叉树的结点数,然后依次输入各个结点的值。在实现插入新结点的函数时,需要一个向一棵二叉树插入新结点的函数。可用递归算法写出平衡二叉树的前序,中序,后序遍历的函数。在写平衡二叉树的前,中,后序遍历的非递归算法时要用到栈结构的知识,运用栈结构来存储平衡二叉树结点的指针。在层次遍历二叉树时需要用到队列结构,运用队列结构的先进先出来存储二叉树的结点指针。在遍历二叉树的结点时需要一个访问结点数据的函数。二叉树是一棵排序树,所以二叉树的查找可以运用其有序的性质,查找的方式和建树的方式相似。交换二叉树各结点的左右子树时,可以用先序遍历递归的方式从根结点向下递归,每
4、次访问结点时就需将各结点的左右孩子的指针调换,并对该结点的平衡因子作相应的处理。示二叉树的深度时,可用递归的方式访问结点的左右子树,并记录下左右子树的深度,最后返回左右子树中较深的深度的值即可。可以用一次遍历的方式遍历二叉树,记录每一个经过的结点,若结点存在且左右孩子都为空,则该结点为叶子结点。删除二叉树的某个结点时,首先要写一个函数,用递归查找的方式找到相应的结点,该函数还要有调整二叉树平衡的作用,因为若删除结点使得二叉树深度减少而不平衡,需要调整二叉树的平衡,若该结点不存在则返回ERROR,,若存在该结点,则应该再写一个函数来删除该结点,在删除之前还要判断该结点是只有左子树还是只有右子树还
5、是左右子树都有的情况:若只有左或是只有右子树,则只需删除该结点,并回溯调整二叉树的平衡;若该结点的左右子树都有,则应该用另一个函数递归找到该结点的直接“后继”,并从该“后继”开始回溯调整二叉树的平衡。下面是需要用到的函数列表:/队列结构 Status InitQueue(SqQueue &Q); /初始化队列 Status EnQueue(SqQueue &Q,QElemType e); /进队列 Status DeQueue(SqQueue &Q,QElemType &e); /出队列 Status GetHead(SqQueue Q,QElemType &e); /获队列首 int Que
6、ueLength(SqQueue Q); /队列长度 Status QueueTraverse(SqQueue Q); /遍历队列 /栈结构 Status InitStack(SqStack &S); /初始化栈 Status Push(SqStack &S,SElemType e); /进栈 Status Pop(SqStack &S,SElemType &e); /出栈 Status GetTop(SqStack S,SElemType &e); /获栈顶 int StackLength(SqStack S); /栈的长度 Status StackEmpty(SqStack S); /判栈
7、空 Status StackTraverse(SqStack S); /栈的遍历 /平衡二叉树 void R_Rotate(BSTree &p); /右旇 void L_Rotate(BSTree &p); /左旇 Status InsertAVL(BSTree &T,ElemType e,Boolean &taller);/平衡二叉树结点插入 void LeftBalance(BSTree &T); /左平衡 void RigthBalance(BSTree &T); /右平衡 Status CreateBST(BSTree &T,int n); /建树 Status Visit(ElemT
8、ype e); /访问 Status PreOrderTraverse(BSTree T); /前序遍历 Status InOrderTraverse(BSTree T); /中序遍历 Status PostOrderTraverse(BSTree T); /后序遍历 Status preOrderIter(BSTree T); /前序非递归遍历 Status inOrderIter(BSTree T); /中序非递归遍历 Status postOrderIter(BSTree T); /后序非递归遍历 Status FindBST(BSTree T,ElemType key,int &n);
9、/在二叉树中查找关键词 Status OverTraverse(BSTree &T); /层次遍历 Status OverChang(BSTree &T); /交换左右子树 int BSTDeep(BSTree T); /求树的深度 Status Sum(BSTree T,int &n); /求结点数 Status DeleteBST(BSTree &T,int key,bool &taller);/删除结点 Status Delete(BSTree &p,bool &taller); Status Delete2(BSTree &p,bool taller,ElemType &f); voi
10、d MU(); /选择菜单二、 解题思路对于要实现的各个操作求解过程:(1) 插入新结点 用递归查找二叉树的方式找到新结点插入的位置,若已经存在该结点则返回ERROR,若不存在,则插入新结点,并回溯调整二叉树的平衡。伪代码如下: Status InsertAVL(BSTree &T,ElemType e,Boolean &taller) If(!T) 插入新结点,树深度增加 Else if(edata) 查找左子树,如果子树增高,调整树平衡 Else if(eT-data) 查找右子树,如果子树增高,调整树平衡 Return OK;(2) 前序、中序、后序遍历二叉树 (递归) 用递归的方式遍历
11、每一个结点,如果左子树不为NULL,则遍历左子树,否则返回;如果右子树不为NULL,则遍历右子树,否则返回。伪代码如下: Status PreOrderTraverse(BSTree T) /前序遍历 if(T) /若结点不为空 if(Visit(T-data) /访问结点 if(PreOrderTraverse(T-lchild) /查找左子树 if(PreOrderTraverse(T-rchild) /查找右子树 return OK; return ERROR; else return OK;Status InOrderTraverse(BSTree T) /中序遍历if(T) /若结点
12、不为空 if(InOrderTraverse(T-lchild) /查找左子树 if(Visit(T-data) /访问结点 if(InOrderTraverse(T-rchild) /查找右子树 return OK; return ERROR; Else return OK;Status PostOrderTraverse(BSTree T) /后序遍历if(T) /若结点不为空 if(PostOrderTraverse(T-lchild) /查找左子树 if(PostOrderTraverse(T-rchild) /查找右子树 if(Visit(T-data) /访问结点 return O
13、K; return ERROR; else return OK;(3) 前序、中序、后序遍历的非递归算法 应该用栈先进后出的性质来保存结点的指针,出栈的过程就是回溯的过程。伪代码如下:Status preOrderIter(BSTree T) /前序非递归遍历 if (T = NULL) return ERROR; /若结点不为空 Push(S,p); /根结点进栈; while (!StackEmpty(S) /栈不空 GetTop(S,p); /获栈顶 Visit(p-data); /先序访问结点 Pop(S,p); /出栈 if (p-rchild != NULL) Push(S,p-rchild); /右子树进栈 if (p-lchild != NULL) Push(S,p-lchild); /左子树进栈 return OK; Status inOrderIter(BSTree T) /中序非递归遍历 if (T = NULL) return ERROR; /若结点不为空 while (p!= NULL | !StackEmpty(S) if (p!= NULL) Push(S,p); /所有左孩子进栈, p=p-lchild; else GetTop(S,p); /获最后一个左子树的结点 Visit(p-data); /访问结点 Pop(S,p); /最
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1