华南农业大学信息学院
综合性、设计性实验
起止日期:2012冬
学院 | 信息学院 | 专业班级 | 软件工程2班 | 学号 | 201130690225 | 姓名 | 许炯勃 |
实 验 题 目 | 实现平衡二叉排序树的各种算法 |
自 我 评 价 | 项 目 | 算法设计 | 独立完成情况 | 算法熟练程度 | 测试通过 |
成功 | 失败 | 独立 | 帮助 | 掌握 | 了解 | 不懂 |
蜀南竹海风景区插入新结点 | √ | | √ | | | 吃猪肉√ | | √ |
前序、中序、后序遍历二叉树(递归) 路由器和交换机的区别 | √ | | √ | | √ | | | √ |
前序、中序、后序遍历的非递归算法 | √ | 在故乡 | √ | | √妒忌是什么意思 | | | √ |
层次遍历二叉树 | √ | | √ | | √ | | | √ |
在二叉树中查找给定关键字 | √ | | √ | | √ | | | √ |
交换各结点的左右子树 | √ | | √ | | √ | | | √ |
求二叉树的深度 | √ | | √ | | √ | | | √ |
叶子结点数 | √ | 南充旅游景点排行 | √ | | √ | | | √ | 早睡早起的好处
删除某结点 | √ | | | √ | | √ | | √ |
●A---------完成实验要求的全部功能并运行通过,算法有一定的新意,程序代码符合书写规范,实验报告叙述清晰完整,有详尽的分析和总结。 ●B---------完成实验要求的全部功能,程序代码符合书写规范,实验报告叙述 清晰完整。 ●C---------完成实验要求的大部分功能,实验报告良好。 ●D---------未按时完成实验,或者抄袭。 |
成绩 | |
| | | | | | | | | | | | | | | | | | | | | |
教师签名:杨秋妹
一,实验所用的数据类型:
(1)二叉树,其结构如下
typedef struct BSTNode{
ElemType data; /*树的值*/
int bf; /*平衡因子*/
struct BSTNode *lchild,*rchild;
} BSTNode,*BSTree;
(2)非递归遍历和层次遍历时用到的栈和队列为C++STL里的自带栈和队列,即
stack<BSTNode *> s;queue<BSTNode *> q;
其操作包括:s.push(SElemType e)//入栈
s.pop()//出栈
s.empty()//判断栈是否为空,是空时返回TRUE
s.top()//返回栈顶元素
q.push(SElemType e)//入队列
q.pop()//出队列
q.empty()//判断队列是否为空,是空时返回TRUE
q.front()//返回队头元素
二,实验所用到的函数及其作用:
(1)SearchBT(BSTree T,ElemType key) /*在二叉树中查找给定关键字(函数返回值为成功TRUE,失败FALSE)*/
(2) InrtAVL(BSTree &T,ElemType e,bool &taller) /*插入结点,并使所成树为平衡二叉排
序树,e为插入结点的值,taller为判断插入结点后树是否长高的布尔型变量*/
(3)R_Rotate(BSTree &p) //将树向右旋转
(4)L_Rotate(BSTree &p) //将树向左旋转
(5) Left_Balance(BSTree &T) //插入结点时向左平衡
(6) Right_Balance(BSTree &T) //插入结点时向右平衡
阅读世界(7) PreOrderTraver(BSTree T,Status(*Visit)(ElemType)) /*递归先序遍历平衡二叉排序树*/
(8) PreOrder(BSTree T,Status(*Visit)(ElemType)) /*非递归先序遍历平衡二叉排序树*/
(9) InOrderTraver(BSTree T,Status(*Visit)(ElemType)) /*递归中序遍历平衡二叉排序树*/
(10) InOrder(BSTree T,Status(*Visit)(ElemType)) /*非递归中序遍历平衡二叉排序树*/
(11) PostOrderTraver(BSTree T,Status(*Visit)(ElemType)) /*递归后序遍历平衡二叉排序树*/
(12) PostOrder(BSTree T,Status(*Visit)(ElemType)) /*非递归后序遍历平衡二叉排序树*/
(13) LevelTraver(BSTree T,Status(*Visit)(ElemType)) /*层次遍历平衡二叉排序树*/
(14) ExchangeNode(BSTree &T) //交换各节点的左右子树
(15) int TreeDepth(BSTree T) //返回树的深度
(16) int LeafCount(BSTree T) //计算树的叶子节点数并返回
(17) CreateBT(BSTree &T) //创建一颗平衡二叉排序树
(18) DeleteAVL(BSTree &p,ElemType e,bool &shorter) /*平衡二叉排序树的删除,e为删除的结点的值,shorter为判断删除结点后树高度是否减小的布尔型变量*/
(19) Delete(BSTree q,BSTree &r,bool &shorter) //结点的删除
(20) Left_Balance_del(BSTree &p,bool &shorter) //删除结点是向左平衡
(21) Right_Balance_del(BSTree&p,bool &shorter) //删除结点时向右平衡
三,算法设计及其实现
(1)结点的插入:在插入结点时,先判断树高度是否改变,再判断是否有结点的平衡因子的绝对值大于1,如果有,则根据情况(分为四种情况:LL型,LR型,RR型,RL型)进行左旋或右旋,使新生成的树也是一颗平衡二叉排序树,代码如下:
Status InrtAVL(BSTree &T,ElemType e,bool &taller){ /*插入结点,并使所成树为平衡二叉排序树*/