当前位置:文档之家› 数据结构课程设计AVL树实现及其分析实验报告

数据结构课程设计AVL树实现及其分析实验报告

算法与数据结构课程设计报告题目: A VLree的实现及分析班级: 12计算机1学号: ************: ***成绩:2013年12月31日一、AVLree的实现及分析AVL 树是平衡的二元查找树。

一株平衡的二元查找树就是指对其每一个节点,其左子树和右子树的高度只差不超过1.编写程序实现AVL树的判别;并实现AVL树的ADT,包括其上的基本操作;节点的加入和删除。

BSt和AVL的差别就在平衡性上,所以AVL的操作关键要考虑如何在保持二元查找树定义条件下对二元树进行平衡化。

(1)编写AVL树的判别程序,并判别一个人元查找数是否为AVL树。

二元查找树用其先序遍历结果表示,如:5,2,1,3,7,8.(2)实现AVL树的ADT,包括其上的基本操作:节点的加入和删除,另外包括将一般二元查找树转变为AVL树的操作。

二、设计思想(宋体,三号加粗)任意给定一组数据,设计一个算法,建立一棵平衡二叉树,对它进行查找、插入、删除等操作。

平衡二叉树ADT结构如下:typedef struct{Status key;}ElemType;typedef struct BSTNode{ElemType data;Status bf;struct BSTNode *lchild,*rchild;}BSTNode,*BSTree;给出一组数据,通过InsertAVL(BSTree &T, ElemType e, Status &taller)插入算法,构建平衡二叉树,若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0。

若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。

在此算法中,利用到递归算法和LeftBalance(BSTree &T)左平衡处理,RightBalance(BSTree &T)右平衡处理。

进而实现构建平衡二叉树,使其左子树和右子树的高度之差不超过1.LeftBalance(BSTree &T)对以指针T所指结点为根的二叉树作左平衡旋转处理。

本算法结束时,指针T指向新的根结点。

RightBalance(BSTree &T)// 对以指针T所指结点为根的二叉树作右平衡旋转处理。

本算法结束时,指针T指向新的根结点。

R_Rotate(BSTree &p)对以*p为根的二叉排序树作右旋处理,处理之后p指向新的树根结点,即旋转处理之前的左子树的根结点L_Rotate(BSTree &p)对以p↑为根的二叉排序树作左旋处理,处理之后p指向新的树根结点,即旋转处理之前的右子树的根结点和Delete(BSTree &p)key的数据元T所指二叉排序指向该数据元素结点,FALSE,指针f指向TAVL树,删除函数流程图:开始查找删除失败删除数据结束四、测试(宋体,三号加粗)创建AVL树,输入一组数据:按先序遍历输出:删除节点7;先序遍历结果:插入数据6后的先序遍历结果:然后退出子目录操作。

输入一组数据创建BST树,判断创建的BST是否为AVL树:创建的BST树不是AVL树,将BST转换为AVL树五、源程序(宋体,三号加粗)函数头代码#include "iostream.h" #include <stdio.h> #include <malloc.h>#define MAXNODE 100 #define TRUE 1 #define FALSE 0 #define OVERFLOW 1 #define LH +1 #define EH 0 #define RH -1typedef int Status; typedef char TElemType;typedef struct {Status key;}ElemType;typedef struct BSTNode { ElemType data; Status bf;struct BSTNode *lchild,*rchild;}BSTNode,*BSTree;Status SearchBST(BSTree T, Status key, BSTree f, BSTree &p) {// 算法9.5(b)// 在根指针T 所指二叉排序树中递归地查找其关键字等于key 的数据元素,// 若查找成功,则指针p 指向该数据元素结点,并返回TRUE ,// 否则指针p 指向查找路径上访问的最后一个结点并返回FALSE ,// 指针f 指向T 的双亲,其初始调用值为NULLif (!T) { p = f; return FALSE; } // 查找不成功else if (key==T->data.key) { p = T; return TRUE; } // 查找成功else if (key<T->data.key)return SearchBST(T->lchild, key, T, p); // 在左子树中继续查找 elsereturn SearchBST(T->rchild, key, T, p); // 在右子树中继续查找 } // SearchBSTStatus InsertBST(BSTree &T, ElemType e) { // 算法9.6 // 当二叉排序树T 中不存在关键字等于e.key 的数据元素时,// 插入e 并返回TRUE ,否则返回FALSE BSTree p,s;if (!SearchBST(T, e.key, NULL, p)) { // 查找不成功s = (BSTree)malloc(sizeof(BSTNode));s->data = e; s->lchild = s->rchild = NULL; if (!p) T = s; // 插入 s 为新的根结点 else if (e.key<p->data.key) p->lchild=s; // 插入s 为左孩子else p->rchild = s; // 插入 s 为右孩子 return TRUE;} else return FALSE; // 树中已有关键字相同的结点,不再插入 } // Insert BSTStatus CreateBST(BSTree &T)//将输入的一组数据,创建为二叉排序树 { Status num; ElemType e;cout<<"请输入二叉排序树结点数:"<<endl; cin>>num; while(num!=0) { cout<<"请输入结点值:"<<endl;cin>>e.key;InsertBST(T,e);//按二叉排序树插入方法; num--;}return 0;}Status max(Status lchild,Status rchild)//取较大的值返回{if(lchild>rchild)return lchild;elsereturn rchild;}Status Depth_bt(BSTree T)//求二叉树深度{if (T==NULL) return 0;return1+max(Depth_bt(T->lchild),Depth_bt(T->rchild));}Status Balance(BSTree T)//递归判断是不是平衡二叉树{Status bl,br;if (T==NULL) return 1;//空树输出是平衡二叉树bl=Depth_bt(T->lchild);//将左子树的深度赋值给bl br=Depth_bt(T->rchild);//将右子树的深度赋值给br if (bl-br>1||br-bl>1)return 0;//如果不满足平衡二叉树的定义返回错误信息return Balance(T->lchild)&&Balance(T->rchild);//递归调用}Status n=0;void N_PreOrderAVL(BSTree T)//先序遍历(根,左,右){if (T){cout<<" "<<T->data.key;n++;N_PreOrderAVL(T->lchild);N_PreOrderAVL(T->rchild);}}Status k_ey[40],k=0;void Key_PreOrderAVL(BSTree T)//先序遍历(根,左,右){if (T){if(k<n){k_ey[k]=T->data.key;k++;}Key_PreOrderAVL(T->lchild);Key_PreOrderAVL(T->rchild);}}int PreorderAVL(BSTree T){if (T){cout<<T->data.key<<" ";PreorderAVL(T->lchild);PreorderAVL(T->rchild);}return 1;}void R_Rotate(BSTree &p) { // 算法 9.9// 对以*p为根的二叉排序树作右旋处理,处理之后p指向新的树根结点,// 即旋转处理之前的左子树的根结点BSTree lc;lc = p->lchild; // lc指向*p的左子树根结点p->lchild = lc->rchild; // lc的右子树挂接为*p的左子树lc->rchild = p; p = lc; // p指向新的根结点} // R_Rotatevoid L_Rotate(BSTree &p) { // 算法 9.10// 对以p↑为根的二叉排序树作左旋处理,处理之后p指向新的树根结点,// 即旋转处理之前的右子树的根结点BSTree rc;rc = p->rchild; // rc指向*p的右子树根结点p->rchild = rc->lchild; // rc的左子树挂接为*p的右子树rc->lchild = p; p = rc; // p指向新的根结点} // L_Rotatevoid LeftBalance(BSTree &T) { // 算法 9.12// 对以指针T所指结点为根的二叉树作左平衡旋转处理。

相关主题