实现平衡二叉树c语言编码,数据结构之---C语言实现平衡二叉树(AVL树)

//AVL(自动平衡二叉树)

#include

#include

typedef int ElemType;

//每个结点的平均值

typedef enum

{

EH = 0,

LH = 1,

RH = -1

}bh_t;

typedef enum

{

FALSE = 0,

TRUE = 1

}bool_t;

//定义平衡二叉树

typedef struct BSTNode

{

ElemType key;//平衡值

int bf;

struct BSTNode *lchild,*rchild;

}BSTNode, *BSTree;

//中序遍历

void InOrderTraverse(BSTree root)

{

if(NULL != root)

{

InOrderTraverse(root->lchild);

printf("%d\t",root->key);

InOrderTraverse(root->rchild);

}

}

//前序遍历

void PreOrderTraverse(BSTree root)

{

if(NULL != root)

{

printf("%d\t",root->key);

PreOrderTraverse(root->lchild);

PreOrderTraverse(root->rchild);

}

}

//右旋

void R_Rotate(BSTree *p)

{

BSTree lc=(*p)->lchild;

(*p)->lchild=lc->rchild;

lc->rchild=*p;

*p=lc;

}

//左旋

void L_Rotate(BSTree *p)

{

BSTree rc=(*p)->rchild;

(*p)->rchild=rc->lchild;

rc->lchild=*p;

*p=rc;

}

//使左平衡

void LeftBalance(BSTree *T)

{

BSTree lc=(*T)->lchild;

BSTree rd = lc->rchild;

//判断进行向哪边旋转

switch(lc->bf)

{

case LH:

(*T)->bf=lc->bf=EH;

R_Rotate(T);

break;

case RH:

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);

break;

}

}

//使右平衡

void RightBalance(BSTree *T)

{

BSTree rc=(*T)->rchild;

BSTree ld=rc->lchild;

switch(rc->bf)

{

case RH:

(*T)->bf=rc->bf=EH;

L_Rotate(T);

break;

case LH:

switch(ld->bf)

{

case RH:

(*T)->bf=LH;

rc->bf=EH;

break;

case EH:

(*T)->bf=rc->bf=EH;

break;

case LH:

(*T)->bf=EH;

rc->bf=RH;

break;

}

ld->bf=EH;

R_Rotate(&((*T)->rchild));

L_Rotate(T);

break;

}

}

//插入元素

bool_t InsertAVL(BSTree *t,ElemType e,bool_t *taller)

{

if(NULL == t)

return FALSE;

if(NULL == *t)

{

*t=(BSTree)malloc(sizeof(BSTNode));

if(NULL == *t)

return FALSE;

(*t)->key=e;

(*t)->lchild=(*t)->rchild=NULL;

(*t)->bf=EH;

*taller=TRUE;

}

else

{

if(e==(*t)->key)

{

*taller=FALSE;

return FALSE;

}

if(ekey)

{

if(FALSE == 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;

}

}

}

else

{

if(FALSE == InsertAVL(&((*t)->rchild),e,taller))

return FALSE;

if(*taller)

{

switch((*t)->bf)

{

case RH:

RightBalance(t);

*taller=FALSE;

break;

case EH:

(*t)->bf=RH;

*taller=TRUE;

break;

case LH:

(*t)->bf=EH;

*taller=FALSE;

break;

}

}

}

}

return TRUE;

}

BSTree searchAVL(BSTree t,ElemType key)

{

BSTree p=t;

while(p)

{

if(p->key==key)

return p;

else if(p->key

p=p->rchild;

else

p=p->lchild;

}

return p;

}

static void destroy(BSTree *t)

{

if(NULL != *t)

{

destroy(&((*t)->lchild));

destroy(&((*t)->rchild));

free(*t);

*t = NULL;

}

return;

}

void destroyAVL(BSTree root)

{

if(NULL != root)

{

destroy(&root);

}

return;

}

int main()

{

BSTree root=NULL,r;

bool_t taller=FALSE;

int array[]={13,24,37,90,53};

int i = 0;

for(i=0; i < 5; i++)

InsertAVL(&root,array[i],&taller);

printf("中序遍历:\n");

InOrderTraverse(root);

printf("\n先序遍历\n");

PreOrderTraverse(root);

printf("\n搜索:37\n");

r=searchAVL(root,37);

if(r)

{

printf("%d\n",r->key);

}

else

{

printf("not find!\n");

}

destroyAVL(root);

root = NULL;

return 0;

}

结果:

be403716b0e3af7c17d9f076e42ef56b.png

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文:http://blog.csdn.net/u012965373/article/details/48168265

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值