数据结构——平衡二叉树的判定

时间:2025-07-06

数据结构——平衡二叉树的判定

数据结构课程设计

——平衡二元树的判定

系 别

专 业 班级学号

姓 名

指导教师

成 绩

2011 年 7 月 14 日

数据结构——平衡二叉树的判定

平衡二元树的判定

一、 需求分析

1. 平衡二叉树(Balanced Binary Tree)又被称为AVL树(区别于AVL算法),且具有以下性质:它是一棵空树或者它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。给定一个二元树的先序遍历或后序遍历结果,判定其是否为平衡二元树。

2. 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中非法字符)和运算结果显示在其后。

二、 概要设计

1. ADT DynamicSearchTable{

数据结构D:D是具有相同特性的数据元素的集合。各个数据元素含有类型相同,可惟一标识数据元素的关键字。

数据关系R:数据元素同属一个集合。

基本操作P:

InitDSTable(&DT);

操作结果:构造一个空的动态查找表DT。

DestroyDSTable(&DT);

初试条件:动态查找表DT存在。

操作结果: 销毁动态查找表DT。

SearchDSTable(DT,key);

初试条件:动态查找表DT存在,key为和关键字类型相同的给定值。

操作结果: 若DT中存在其关键字等于key的数据元素,则函数值为该元素的值或表中的位置,否则为“空”。

InsertDSTable(&DT,e);

初试条件:动态查找表DT存在,e为待插入的数据元素。

操作结果: 若DT中不存在其关键字等于e. key的数据元素,则插入e到DT。 DeleteDSTable(&DT,key);

初试条件:动态查找表DT存在,key为和关键字类型相同的给定值。 操作结果: 若DT中存在其关键字等于key的数据元素,则删除之。 TraverseDSTable(DT,Visit());

初试条件:动态查找表DT存在,Visit()是结点操作的应用函数。 操作结果: 按某种次序对DT的每个结点调用函数Visit()一次且至多 一次。一但Visit()失败,则操作失败。

}ADT DynamicSearchTable

2. 程序模块

2

数据结构——平衡二叉树的判定

本程序只有两个模块,调用关系简单本程序只有两个模块,调用关系简单:主程序模块和平衡二叉树的模块。即:

Void main(){

Do{

接受命令(根据提示输入终点城市和起点城市的序号);

处理命令;

}while(“命令”=“退出”);

}

3. 设计原理框图

数据结构——平衡二叉树的判定

三、 详细设计

1. 根据题目要求和查找的基本特点,其结点类型

typedef struct BSTnode{

int data;

int bf;

struct BSTnode *lchild,*rchild;

}BSTnode,*bstree;

#define LH +1

#define EH 0

#define RH -1

/*对平衡二叉树的操作

bstree InsertAVL(bstree &T, int e);

////////在平衡二叉树中插入结点。

int FindAVL(bstree p,int e);

////////查找平衡二叉树中是否有结点e。

bstree DeleteAVL(bstree &T,int e)

////////删除平衡平衡二叉树的结点e,并保持平衡二叉树的性质。

int Preordertraverse(bstree T)

////////按先序遍历平衡二叉树。

/------------------------************平衡二叉树的操作的详细算法

bstree InsertAVL(bstree &T, int e)

{

bstree p;

//插入新结点,树长高置taller为TRUE

if(!T) {

T=(bstree)malloc(sizeof(BSTnode));

T->data=e;

4

数据结构——平衡二叉树的判定

T->lchild=T->rchild=NULL;

T->bf=EH;

taller=TRUE;

}

else {

//树中存在和e有相同关键字的结点则不再插入

if(e==T->data){

taller=FALSE;

return NULL;

}

//值小于则继续在树的左子树中搜索

if(e < T->data){

//插入到左子树且左子树长高

p=InsertAVL(T->lchild,e);

if(p){

T->lchild=p;

if(taller) {

switch(T->bf){ //检查*T的平衡度

case LH: //原本左子树比右子树高,需要做左平衡处理

T=LeftBalance(T);

taller=FALSE;

break;

case EH: //原本左子树和右子树同高,现因左子树争高而使树增高

T->bf=LH;

taller=TRUE;

break;

case RH: //原本右子树比左子树高,现在左右子树等高

T->bf=EH;

taller=FALSE;

break;

}///////switch(T->bf)

}///////if(taller)

}/////if(p)

}///////if(e < T->data)

//继续在*T的右子树中搜索

else{

//插入到右子树且使右子树长高

p=InsertAVL(T->rchild,e);

if (p){

T->rchild=p;

if(taller) {

5

数据结构——平衡二叉树的判定

switch(T->bf){ //检查*T的平衡度

case LH: //原本左子树比右子树高,现在左右子树等高

T->bf=EH;

taller=FALSE;

break;

case EH: //原本左子树和右子树同高,现因右子树增高而使树增高

T->bf=RH;

taller=TRUE;

break;

case RH: //原本右子树比左子树高,需要做右平衡处理

T=RightBalance(T);

taller=FALSE;

break;

}//////switch(T->bf)

}/////if(taller)

}/////if (p)

}//////if(e > T->data)

}///////else< …… 此处隐藏:5490字,全部文档内容请下载后查看。喜欢就下载吧 ……

数据结构——平衡二叉树的判定.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219