資料結構之---C語言實現平衡二叉樹(AVL樹),

來源:互聯網
上載者:User

資料結構之---C語言實現平衡二叉樹(AVL樹),

//AVL(自動平衡二叉樹)#include <stdio.h>#include <stdlib.h>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(e<(*t)->key)  {   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<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;}


結果:


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.