数据结构 平衡二叉树的操作演示

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

平衡二叉树操作的演示

1.需求分析

本程序是利用平衡二叉树,实现动态查找表的基本功能:创建表,查找、插入、删除。具体功能:

(1)初始,平衡二叉树为空树,操作界面给出创建、查找、插入、删除、合并、分裂六种操作供选择。每种操作均提示输入关键字。每次插入或删除一个结点后,更

新平衡二叉树的显示。

(2)平衡二叉树的显示采用凹入表现形式。

(3)合并两棵平衡二叉树。

(4)把一棵二叉树分裂为两棵平衡二叉树,使得在一棵树中的所有关键字都小于或等于x,另一棵树中的任一关键字都大于x。

如下图:

2.概要设计

平衡二叉树是在构造二叉排序树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。

具体步骤:

(1)每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值不超过1,则平衡二叉树没有失去平衡,继续插入结点;

(2)若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;

(3)判断新插入的结点与最小不平衡子树的根结点个关系,确定是那种类型的调整;(4)如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或RL型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;(5)计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后平衡二叉树中是否存在平衡因子大于1的结点。

流程图

3.详细设计

二叉树类型定义:

typedef int Status;

typedef int ElemType;

typedef struct BSTNode{

ElemType data;

int bf;

struct BSTNode *lchild ,*rchild;

} BSTNode,* BSTree;

Status SearchBST(BSTree T,ElemType e)//查找

void R_Rotate(BSTree &p)//右旋

void L_Rotate(BSTree &p)//左旋

void LeftBalance(BSTree &T)//插入平衡调整

void RightBalance(BSTree &T)//插入平衡调整

Status InsertAVL(BSTree &T,ElemType e,int &taller)//插入

void DELeftBalance(BSTree &T)//删除平衡调整

void DERightBalance(BSTree &T)//删除平衡调整

Status Delete(BSTree &T,int &shorter)//删除操作

Status DeleteAVL(BSTree &T,ElemType e,int &shorter)//删除操作

void merge(BSTree &T1,BSTree &T2)//合并操作

void splitBSTree(BSTree T,ElemType e,BSTree &T1,BSTree &T2)//分裂操作void PrintBSTree(BSTree &T,int lev)//凹入表显示

附录

源代码:

#include

#include

//#define TRUE 1

//#define FALSE 0

//#define OK 1

//#define ERROR 0

#define LH +1

#define EH 0

#define RH -1

//二叉类型树的类型定义

typedef int Status;

typedef int ElemType;

typedef struct BSTNode{

ElemType data;

int bf;//结点的平衡因子

struct BSTNode *lchild ,*rchild;//左、右孩子指针

} BSTNode,* BSTree;

/*

查找算法

*/

Status SearchBST(BSTree T,ElemType e){

if(!T){

return 0; //查找失败

}

else if(e == T->data ){

return 1; //查找成功

}

else if (e < T->data){

return SearchBST(T->lchild,e);

}

else{

return SearchBST(T->rchild,e);

}

}

//右旋

void R_Rotate(BSTree &p){

BSTree lc; //处理之前的左子树根结点

lc = p->lchild; //lc指向的*p的左子树根结点

p->lchild = lc->rchild; //lc的右子树挂接为*P的左子树lc->rchild = p;

p = lc; //p指向新的根结点

}

//左旋

void L_Rotate(BSTree &p){

BSTree rc;

rc = p->rchild; //rc指向的*p的右子树根结点

p->rchild = rc->lchild; //rc的左子树挂接为*p的右子树

相关文档
最新文档