数据结构课程设计:平衡二叉树

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

1 课程设计的目的和内容 (1)

1.1 课程设计目的 (1)

1.2 主要内容 (1)

2 课程设计分析 (2)

2.1 程序的目的和要求 (2)

2.2 程序的主要数据和功能模块 (2)

3 详细设计 (5)

3.1 程序主要功能模块的伪代码算法 (5)

3.2 程序主要流程图 (8)

4 测试数据与测试结果 (9)

5 程序的使用和改进 (14)

5.1 用户使用说明 (14)

5.2 程序的改进 (14)

6 课程设计小结 (15)

7 参考文献 (15)

1 课程设计的目的和内容

1.1 课程设计目的

复习二叉树的三叉链表存储结构和遍历方法。

掌握二叉排序树的特点和生成方法。

掌握平衡二叉树四种不平衡形态的判定和旋转为平衡的方法。

1.2 主要内容

(1)输入结点数据,构造二叉树的结点,按二叉排序树的规则插入该结点到三叉链表中;

(2)通过插入函数InsertAVL(BSTNode* &T,int key)插入新结点到二叉树中,并递归调用插入函数本身,直到正确插入到二叉树中,并返回上次递归,每返回上次递归一次同时判断其平衡度bf,找到最小不平衡树的根结点p。

(3)判断最小不平衡树的平衡因子(bf)的值,若bf>1, 则调用左平衡函数LeftBalance(),若bf<-1,则调用右平衡函RightBalance(),再判断根结点p的左(右)孩子的平衡因子(共有LL型、LR型、RR型、RL型四种),然后判定得到的不平衡形态调用不同的旋转函数即可将其重新调整为平衡二叉树;

(4)重复步骤(1)(2)(3),直到所有结点都插入到该平衡二叉树中为止;

(5)输出该二叉树的前序(或者后序)序列和中序序列,手工恢复出该二叉树,检验其是否为平衡二叉树;并验证其中序序列的有序性。

2 课程设计分析

2.1 程序的目的和要求

(1)本程序演示平衡二叉树的插入,以及AVL的前序遍历和中序遍历,并且验证其中序遍历有序性。

(2)对平衡二叉树出现的的的LL,LR,RL,RR四种情况进行处理是其平衡。

(3)接着要实现平衡二叉树的插入,其中根据平衡二叉树插入的算法要不停的把插入的元素平衡地插入,需要判断平衡并调用左右旋转函数,更新平衡二叉树

2.2 程序的主要数据和功能模块

(1)程序主要数据

平衡二叉树左右子树的深度:ldep,rdep

平衡因子:bf= TreeDepth(ldep)- TreeDepth(rdep)

(2)程序主要功能模块

求树深函数: TreeDepth()

左(右)旋函数: L_Rotate(), R_Rotate()

左右平衡函数: LeftBalance(), RightBalance()

插入函数: InsertAVL()

前(中)序遍历: Preorder(), Inorder()

输出二叉树函数 Output()

(3)程序主要功能模块之间的调用

插入函数InsertAVL(BSTNode* &T,int key)要调用左平衡函数LeftBalance()和右平衡函数RightBalance(),左右平衡函数要调用左旋函数R_Rotate()和右旋函数L_Rotate()

(4)平衡二叉树不平衡形态分析

1) LL 型:

新结点 1 插在结点 3 的左孩子的左子树里。调整方法见图2.1。图中以结点2为轴心,将结点结点3从结点2 的右上方转到结点2 的右下侧,使结点 3成为结点2 的右孩子。

图2.1

2)RR 型:

新结点3 插在结点 1 的右孩子的右子树里。调整方法见图2.2.2。图中以结点 2 为轴心,将结点1 从结点2的左上方转到结点2 的左下侧,使结点1成为结点2 的左孩子。

图2.2

3)LR 型:

新结点 2 插在结点 3的左孩子的右子树里。调整方法见图2.3 。分为两步进行:第一步以结点 2 为轴心,将结点 1 从结点2 的左上方转到结点2 的左下侧,使结点1 成为结点2 的左孩子,结点 2 成为结点3的左孩子。第二步跟 LL 型一样处理 ( 应以结点2为轴心 ) 。

1

2

3

2

1

3

RR 型

3

1

2

3

2

1

LL 型

图2.3

4)RL 型:

新结点 2 插在 1的右孩子的左子树里。调整方法见图2.4 。分为两步进行:第一步以结点2为轴心,将结点 3 从结点 2 的右上方转到结点 2 的右下侧,使结点3 成为结点2 的右孩子,结点 2成为结点 1的右孩子。第二步跟 RR 型一样处理 ( 应以结点2 为轴心 ) 。

图2.4

2

1

3

3 2

1

2

1

3

RL 型

3 1 2

3

2

1

2

1

3

LR 型

3 详细设计

3.1 程序主要功能模块的伪代码算法

(1)对以*p为根的二叉排序树作右旋处理

void R_Rotate(BSTree &p)

{

BSTNode* lc;

lc=p->lchild;

p->lchild=lc->rchild;

lc->rchild=p;

p=lc;

}

对以*p为根的二叉排序树作左旋处理

void L_Rotate(BSTree &p)

{

BSTNode* rc;

rc=p->rchild;

p->rchild=rc->lchild;

rc->lchild=p;

p=rc;

}

(2)对以指针T所指结点为根的二叉排序树作左平衡旋转处理void LeftBalance(BSTree &T)

{

int bf;

BSTNode* lc;

lc=T->lchild;

bf = TreeDepth(lc->lchild) - TreeDepth(lc->rchild);

switch(bf)

{

case +1: //LL

R_Rotate(T);

break;

case -1: //LR

L_Rotate(T->lchild);

相关文档
最新文档