《数据结构》课程设计--二叉排序树调整为平衡二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》课程设计--二叉排序树调整为平衡二叉树
2013-2014学年第一学期《数据结构》课程设计报告
题目:二叉排序树调整为平衡二叉树
专业:网络工程
班级:二
姓名:汪杰
指导教师:刘义红
成绩:
计算机与信息工程系
2013年 1 月 2日
目录
1、问题描述………………………………………
2、设计思路(数学模型的选择) ……………
3、二叉排序树和平衡二叉树定义…………………………
4、程序清单……………………………
5.程序功能说明……………………………
5.运行与调试分析………………………
6.总结…………………………………
1.问题描述
输入带排序序列生成二叉排序树,并调整使其变为平衡二叉树,运行并进行调试。
2.设计思路
平衡二叉树的调整方法
平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
具体步骤如下:⑴每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点;
⑵若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;
⑶判断新插入的结点与最小不平衡子树的根结点的关系,确定是哪种类型的调整;
⑷如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或LR型,则需应用扁担原理旋转两次,第一次最小不
平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;
3.二叉排序树和平衡二叉树定义
二叉排序树
二叉排序树(Binary Sort Tree)又称二叉查找树。
它或者是一棵空树;或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)(3)左、右子树也分别为二叉排序树;
平衡二叉树
平衡二叉树(Balanced Binary Tree 或Height-Balanced Tree)又称AVL树,它或者是一棵空树,或者是具有以下性质的二叉;它的左子树右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1,平衡二叉树上的任何节点的左子树和右子树的深度的差值只能是-1、0或1。
4.程序功能说明
void preorder(bintree t)/*前序遍历*/
void midorder(bintree t)/*中序遍历*/
lastorder(bintree t)/*后序遍历
{bintree a;int j,k;clrscr();textcolor(2);
printf("**************************欢迎您使用本二叉树操作系统**************************\n");
printf("建造一棵二叉树请您输入各个结点的元素值,()表示一个空格键:\n");
printf("输入示例:abc()()de()g()()f()()()回
车:\n");a=createbitree();
printf("您输入的二叉数嵌套法表示如
下:\n");printree(a);printf("\n");
printf("树的深度为:\n");
j=treedepth(a);printf("%d\n",j);
printf("二叉数的叶子接点个数为:\n");
k=treeleaf(a);printf("%d\n",k);
printf("您所输入的二叉树的前序遍历顺序输出如下:\n"); if(!a) printf("二叉树为空\n");
else{preorder(a);printf("\n");}
printf("您所输入的二叉树的中序遍历顺序如下输出:\n"); if(!a) printf("二叉树为空\n");else{
midorder(a);printf("\n");}
printf("您所输入的二叉树的后序遍历顺序输出如下:\n"); if(!a) printf("二叉树为空\n");
else{lastorder(a);printf("\n");}
printf("您所输入的二叉树的层次顺序遍历输出如下:\n"); if(!a) printf("二叉树为空\n");
else{
translevel(a);}}
5.程序清单
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define NULL 0
int leftdep,rightdep;
typedef struct bitnode
{char data;struct bitnode *lchild,*rchild;} bintnode,*bintree;bintree createbitree()
{bintree t;char x;scanf("%c",&x);
if(x==' ') t=NULL;
else{t=(bintnode *)malloc(sizeof(bintnode));
t->data=x;
t->lchild=createbitree();
t->rchild=createbitree();
}return(t);}
void preorder(bintree t)/*前序遍历*/
{if(t)
{printf("%2c",t->data);
preorder(t->lchild);
preorder(t->rchild);}}
void midorder(bintree t)/*中序遍历*/
{if(t)
{
midorder(t->lchild);
printf("%2c",t->data);
midorder(t->rchild);}}
void printree(bintree t)
{if(t!=NULL)
{printf("%c",t->data);
if(t->lchild!=NULL||t->rchild!=NULL)
{printf("(");printree(t->lchild);
if(t->rchild!=NULL) printf(",");
printree(t->rchild); printf(")");}}}
int treedepth(bintree t)
{if(t==NULL) return 0;
else{leftdep=treedepth(t->lchild);
rightdep=treedepth(t->rchild);
if(leftdep>rightdep)return (leftdep+1); elsereturn(rightdep+1);}}
int treeleaf(bintree t)
{if(t==NULL)return0;else
if(t->lchild==NULL&&t->rchild==NULL)
return1;else
return(treeleaf(t->lchild)+treeleaf(t->rchild));}void lastorder(bintree t)/*后序遍历
*/{if(t){lastorder(t->lchild);lastorder(t->rchild);pr intf("%2c",t->data);}}
void translevel(bintree t)
{struct bitnode{bintree vec[30];
int f,r;}q;q.f=0;q.r=0;if(t!=NULL)
printf("%2c",t->data);
q.vec[q.r]=t;q.r=q.r+1;
while (q.f<q.r)
{t=q.vec[q.f];q.f=q.f+1;
if(t->lchild!=NULL)
{printf("%2c",t->lchild->data);
q.vec[q.r]=t->lchild; q.r=q.r+1;}
if(t->rchild!=NULL)
{printf("%2c",t->rchild->data);
q.vec[q.r]=t->rchild;
q.r=q.r+1;}} printf("\n");}
main(){bintree a;int j,k;clrscr();textcolor(2);
printf("**************************欢迎您使用本二叉树操作系统**************************\n");
printf("建造一棵二叉树请您输入各个结点的元素值,()表示一个空格键:\n");
printf("输入示例:abc()()de()g()()f()()()回
车:\n");a=createbitree();
printf("您输入的二叉数嵌套法表示如
下:\n");printree(a);printf("\n");
printf("树的深度为:\n");
j=treedepth(a);printf("%d\n",j);
printf("二叉数的叶子接点个数为:\n");
k=treeleaf(a);printf("%d\n",k);
printf("您所输入的二叉树的前序遍历顺序输出如下:\n"); if(!a) printf("二叉树为空\n");
else{preorder(a);printf("\n");}
printf("您所输入的二叉树的中序遍历顺序如下输出:\n"); if(!a) printf("二叉树为空\n");else{
midorder(a);printf("\n");}
printf("您所输入的二叉树的后序遍历顺序输出如下:\n"); if(!a) printf("二叉树为空\n");
else{lastorder(a);printf("\n");}
计算机与信息工程系《数据结构》课程设计报告
printf("您所输入的二叉树的层次顺序遍历输出如下:\n"); if(!a) printf("二叉树为空\n");
else{
translevel(a);}}
5.运行与调试分析
输入几个数据进行运行调试,观察运行结果是否达到预期的目的,运行中可能出现逻辑错误,输入数据合适与否以及相关细节都可能会影响程序的运行,可以试着变换相关数据对二叉排序树和平衡二叉树的转换进行调整,分析实验数据对转换的影响。
了解二叉排序树和平衡二叉树的结构和特点,分析运行调试可能出现的问题,可以试着找出这些问题,并改变相关数据试着验证自己的设想。
7.总结
想起老师的“难事破与易”,再复杂的事折成一个个简单的小部分,逐个击破,然后再凑起来,复杂的事也就变得简单了。
在编程时尽可能使用全局变量,避免局部变量的使用。
还有就是编程基础还要扎实起来。
1。