平衡二叉树的创建

在下为了这可平衡二叉树呕心沥血,差点把屎都呕出来了,下面是源代码,如果有错,请见谅!!

///    head.h   ///
#include <iostream>
using namespace std;

#define EQ( a , b )  ( (a) == (b) )
#define LT( a , b )  ( (a) < (b) )
#define LQ( a , b )  ( (a) > (b) )

#define LH +1     //left side is higher
#define EH 0       // the same high
#define RH -1     //ringt side is higher

typedef struct BSTNode
{
int data;
int bf;
struct BSTNode *lchild, *rchlid;
}BSTNode, *BSTree;


void R_Rotate( BSTree &p )
{
BSTree lc;
lc=p->lchild;
p->lchild=lc->rchlid;
lc->rchlid=p;
p=lc;
}

void L_Rotate( BSTree &p )
{
BSTree rc;
rc=p->rchlid;
p->rchlid=rc->lchild;
rc->lchild=p;
p=rc;
}

void LeftBalance( BSTree &T )
{
BSTree lc,rd;
lc=T->lchild;
switch( lc->bf )
{
case LH :
T->bf=lc->bf=EH;
R_Rotate(T);
break;

case RH :
rd=lc->rchlid;
switch( rd->bf )
{
case LH:
T->bf=RH;
lc->bf=EH;
break;
case EH:
T->bf=lc->bf=EH;
break;
case RH:
T->bf=EH;
lc->bf=LH;
break;
}

rd->bf=EH;
L_Rotate( T->lchild );
R_Rotate( T );
}
}

void RightBalance( BSTree &T )
{
BSTree rc, ld;
rc=T->rchlid;
switch( rc->bf )
{
case RH:
T->bf=rc->bf=EH;
L_Rotate( T );
break;
case LH:
ld=rc->lchild;
switch( ld->bf )
{
case LH:
T->bf=EH;
rc->bf=RH;
break;
case EH:
T->bf=rc->bf=EH;
break;
case RH:
T->bf=LH;
rc->bf=EH;
break;
}
ld->bf=EH;
R_Rotate( T->rchlid );
L_Rotate( T );
}
}

bool InsertAVL( BSTree &T , int e , bool &taller )
{
if( !T )
{
T=( BSTree )malloc( sizeof( BSTNode) );
T->data=e;
T->lchild=T->rchlid=NULL;
T->bf=EH;
taller=true;
}

else
{
if( EQ( e, T->data ) )
{
taller=false;
cout<<"the key has existed"<<endl;
return false ;
}
if( LT(e,T->data) )
{
if( !InsertAVL(T->lchild, e, taller) )
{
return false;
}
if( taller )
{
switch( T->bf )
{
case LH:
LeftBalance( T );
taller=false;
break;
case EH:
T->bf=LH;
taller=true;
break;
case RH:
T->bf=EH;
taller=false;
break;
}//switch
}//if(taller)
}//if

else
{
if( !InsertAVL(T->rchlid,e,taller) )
{
return false;
}
if( taller )
{
switch( T->bf )
{
case LH:
T->bf=EH;
taller=false;
break;
case EH:
T->bf=RH;
taller=true;
break;
case RH:
RightBalance(T);
taller=false;
break;
}
}//if(taller)
}//else

}//else
return true;
}

void PrintBST( BSTree T, int m )
{
int i;
if( T->rchlid )
PrintBST(T->rchlid,m+1);

for( i=1; i<=m; i++ )
cout<<"    ";
cout<<T->data<<endl;

if( T->lchild )
PrintBST(T->lchild,m+1);
}

void CreateBST( BSTree &T )
{
int e, m;
bool taller =false ;
T=NULL;

cout<<"Please input keys ( End with -1) :";
cin>>e;
while( e!=-1 )
{
InsertAVL(T,e,taller);
cout<<"Please input keys (End with -1):";
cin>>e;
taller=false ;
}

m=0;
cout<<"Now it will show you this BSTree by hengxiang:"<<endl;
if( T )
PrintBST(T,m);
else
cout<<"This is a empty tree !"<<endl;
}

//main.cpp   //
#include "head.h"

void R_Rotate( BSTree &p );
void L_Rotate( BSTree &p );
void LeftBalance( BSTree &T );
void RightBalance( BSTree &T );
bool InsertAVL( BSTree &T , int e , bool &taller );
void PrintBST( BSTree T, int m );
void CreateBST( BSTree &T );


void main()
{
BSTree T;
CreateBST(T);

}

上面是创建这棵树的原理,在下还是糊里糊涂的,你们还是去看看别的参考资料把!!!!
基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值