亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言 數據結構平衡二叉樹實例詳解

2020-01-26 14:04:04
字體:
來源:轉載
供稿:網友

數據結構平衡二叉樹

參考代碼如下:

/*   名稱:平衡二叉樹   語言:數據結構C語言版    編譯環境:VC++ 6.0   日期: 2014-3-26  */ #include <stdio.h> #include <malloc.h> #include <windows.h> #define LH +1  // 左高  #define EH 0  // 等高  #define RH -1  // 右高  #define N 5   // 數據元素個數   typedef char KeyType; // 設關鍵字域為字符型   typedef struct {   KeyType key;   int order; }ElemType; // 數據元素類型   // 平衡二叉樹的類型  typedef struct BSTNode {   ElemType data;   // bf結點的平衡因子,只能夠取0,-1,1,它是左子樹的深度減去   // 右子樹的深度得到的   int bf;    struct BSTNode *lchild,*rchild; // 左、右孩子指針  }BSTNode,*BSTree;  // 構造一個空的動態查找表DT int InitDSTable(BSTree *DT)  {   *DT=NULL;   return 1; }  // 銷毀動態查找表DT  void DestroyDSTable(BSTree *DT)  {   if(*DT) // 非空樹    {     if((*DT)->lchild) // 有左孩子        DestroyDSTable(&(*DT)->lchild); // 銷毀左孩子子樹      if((*DT)->rchild) // 有右孩子        DestroyDSTable(&(*DT)->rchild); // 銷毀右孩子子樹      free(*DT); // 釋放根結點      *DT=NULL; // 空指針賦0    } }  // 在根指針T所指二叉排序樹中遞歸地查找某關鍵字等于key的數據元素,  // 若查找成功,則返回指向該數據元素結點的指針,否則返回空指針。 BSTree SearchBST(BSTree T,KeyType key) {   if((!T)|| (key == T->data.key))     return T; // 查找結束    else if(key < T->data.key) // 在左子樹中繼續查找      return SearchBST(T->lchild,key);   else     return SearchBST(T->rchild,key); // 在右子樹中繼續查找  }  // 對以*p為根的二叉排序樹作右旋處理,處理之后p指向新的樹根結點,即旋轉  // 處理之前的左子樹的根結點。 void R_Rotate(BSTree *p) {   BSTree lc;   lc=(*p)->lchild; // lc指向p的左子樹根結點    (*p)->lchild=lc->rchild; // lc的右子樹掛接為p的左子樹    lc->rchild=*p;   *p=lc; // p指向新的根結點  }  // 對以*p為根的二叉排序樹作左旋處理,處理之后p指向新的樹根結點,即旋轉  // 處理之前的右子樹的根結點。 void L_Rotate(BSTree *p) {   BSTree rc;   rc=(*p)->rchild; // rc指向p的右子樹根結點    (*p)->rchild=rc->lchild; // rc的左子樹掛接為p的右子樹    rc->lchild=*p;   *p=rc; // p指向新的根結點  }  // 對以指針T所指結點為根的二叉樹作左平衡旋轉處理,本算法結束時,  // 指針T指向新的根結點。 void LeftBalance(BSTree *T) {     BSTree lc,rd;   lc=(*T)->lchild; // lc指向*T的左子樹根結點    switch(lc->bf)   { // 檢查*T的左子樹的平衡度,并作相應平衡處理    case LH: // 新結點插入在*T的左孩子的左子樹上,要作單右旋處理      (*T)->bf=lc->bf=EH;     R_Rotate(T);     break;   case RH: // 新結點插入在*T的左孩子的右子樹上,要作雙旋處理      rd=lc->rchild; // rd指向*T的左孩子的右子樹根      switch(rd->bf)     { // 修改*T及其左孩子的平衡因子      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;     }     rd->bf=EH;     L_Rotate(&(*T)->lchild); // 對*T的左子樹作左旋平衡處理      R_Rotate(T); // 對*T作右旋平衡處理    } }  // 對以指針T所指結點為根的二叉樹作右平衡旋轉處理,本算法結束時,  // 指針T指向新的根結點 void RightBalance(BSTree *T) {   BSTree rc,rd;   rc=(*T)->rchild; // rc指向*T的右子樹根結點    switch(rc->bf)   { // 檢查*T的右子樹的平衡度,并作相應平衡處理    case RH: // 新結點插入在*T的右孩子的右子樹上,要作單左旋處理      (*T)->bf=rc->bf=EH;     L_Rotate(T);     break;   case LH: // 新結點插入在*T的右孩子的左子樹上,要作雙旋處理      rd=rc->lchild; // rd指向*T的右孩子的左子樹根      switch(rd->bf)     { // 修改*T及其右孩子的平衡因子      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;     }     rd->bf=EH;     R_Rotate(&(*T)->rchild); // 對*T的右子樹作右旋平衡處理      L_Rotate(T); // 對*T作左旋平衡處理    } }  // 若在平衡的二叉排序樹T中不存在和e有相同關鍵字的結點,則插入一個  // 數據元素為e的新結點,并返回1,否則返回0。若因插入而使二叉排序樹  // 失去平衡,則作平衡旋轉處理,布爾變量taller反映T長高與否。  int InsertAVL(BSTree *T,ElemType e,int *taller) {   if(!*T)   { // 插入新結點,樹“長高”,置taller為1      *T=(BSTree)malloc(sizeof(BSTNode));     (*T)->data=e;     (*T)->lchild=(*T)->rchild=NULL;     (*T)->bf=EH;     *taller=1;   }   else   {     if(e.key == (*T)->data.key)     { // 樹中已存在和e有相同關鍵字的結點則不再插入        *taller=0;       return 0;     }     if(e.key < (*T)->data.key)     { // 應繼續在*T的左子樹中進行搜索        if(!InsertAVL(&(*T)->lchild,e,taller)) // 未插入          return 0;       if(*taller)         // 已插入到*T的左子樹中且左子樹“長高”          switch((*T)->bf) // 檢查*T的平衡度          {         case LH:           // 原本左子樹比右子樹高,需要作左平衡處理            LeftBalance(T);           *taller=0; //標志沒長高           break;         case EH:           // 原本左、右子樹等高,現因左子樹增高而使樹增高            (*T)->bf=LH;           *taller=1; //標志長高           break;         case RH:           // 原本右子樹比左子樹高,現左、右子樹等高           (*T)->bf=EH;            *taller=0; //標志沒長高       }     }     else     {       // 應繼續在*T的右子樹中進行搜索        if(!InsertAVL(&(*T)->rchild,e,taller)) // 未插入          return 0;       if(*taller) // 已插入到T的右子樹且右子樹“長高”          switch((*T)->bf) // 檢查T的平衡度        {       case LH:          (*T)->bf=EH; // 原本左子樹比右子樹高,現左、右子樹等高          *taller=0;         break;       case EH: // 原本左、右子樹等高,現因右子樹增高而使樹增高          (*T)->bf=RH;         *taller=1;         break;       case RH: // 原本右子樹比左子樹高,需要作右平衡處理          RightBalance(T);         *taller=0;       }     }   }   return 1; }  // 按關鍵字的順序對DT的每個結點調用函數Visit()一次 void TraverseDSTable(BSTree DT,void(*Visit)(ElemType)) {    if(DT)   {     TraverseDSTable(DT->lchild,Visit); // 先中序遍歷左子樹      Visit(DT->data); // 再訪問根結點      TraverseDSTable(DT->rchild,Visit); // 最后中序遍歷右子樹    } }   void print(ElemType c) {   printf("(%d,%d)",c.key,c.order); }  int main() {   BSTree dt,p;   int k;   int i;   KeyType j;   ElemType r[N]={     {13,1},{24,2},{37,3},{90,4},{53,5}   }; // (以教科書P234圖9.12為例)       InitDSTable(&dt);  // 初始化空樹    for(i=0;i<N;i++)     InsertAVL(&dt,r[i],&k); // 建平衡二叉樹    TraverseDSTable(dt,print); // 按關鍵字順序遍歷二叉樹    printf("/n請輸入待查找的關鍵字: ");   scanf("%d",&j);   p=SearchBST(dt,j); // 查找給定關鍵字的記錄    if(p)     print(p->data);   else     printf("表中不存在此值");   printf("/n");   DestroyDSTable(&dt);      system("pause");   return 0; } /* 輸出效果:  (13,1)(24,2)(37,3)(53,5)(90,4) 請輸入待查找的關鍵字: 53 (53,5) 請按任意鍵繼續. . .   */ 

運行結果如下:

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
热re99久久精品国产66热| 日本精品久久久久久久| 久久精品99国产精品酒店日本| 欧美大片大片在线播放| 亚洲成人a级网| 亚洲一品av免费观看| 成人黄色av播放免费| 自拍亚洲一区欧美另类| 91精品国产综合久久男男| 2018中文字幕一区二区三区| 亚洲国产欧美一区二区三区同亚洲| 在线观看欧美日韩国产| 国产综合色香蕉精品| 欧美贵妇videos办公室| 成人激情av在线| 国产一区二区三区高清在线观看| www.99久久热国产日韩欧美.com| 欧美激情免费视频| 中文字幕日韩欧美精品在线观看| 91视频国产精品| 91精品国产色综合| 亚洲欧美日韩另类| 在线视频一区二区| 久久精品中文字幕一区| 久久久久久久亚洲精品| 国产成人一区二区在线| 成人精品视频99在线观看免费| 日韩精品黄色网| 97在线日本国产| 日韩精品极品毛片系列视频| 亚洲欧美国产一本综合首页| 久久视频国产精品免费视频在线| 国产精品白丝jk喷水视频一区| 97人洗澡人人免费公开视频碰碰碰| 日韩中文视频免费在线观看| 久久精品国产v日韩v亚洲| 成人性生交大片免费看视频直播| 精品久久久久久久久久久久久久| 色一情一乱一区二区| 一区二区三区亚洲| 精品久久久久久久久久ntr影视| 日韩精品高清视频| 中文字幕日韩精品有码视频| 欧美在线视频免费观看| 九九热精品视频国产| 高清欧美性猛交| 精品久久久香蕉免费精品视频| 日韩在线视频观看| 欧美亚洲国产日韩2020| 日韩在线欧美在线国产在线| 91久久精品在线| 国产在线一区二区三区| 国模私拍一区二区三区| 中文字幕在线看视频国产欧美在线看完整| 精品福利免费观看| 欧美美女18p| 黄色成人av在线| 91久久精品视频| 久久视频国产精品免费视频在线| 欧美日在线观看| 亚洲国产另类 国产精品国产免费| 亚洲精品免费av| 96精品视频在线| 国产精品久久久久免费a∨大胸| 国产精品久久久久久久久久99| 国产午夜精品理论片a级探花| 精品视频偷偷看在线观看| 国产精品爱啪在线线免费观看| 亚洲人成电影网站色xx| 久久中文字幕国产| 91免费精品国偷自产在线| 日韩在线一区二区三区免费视频| 国产日韩中文字幕| 久久久精品国产| 黑人巨大精品欧美一区二区免费| 久久理论片午夜琪琪电影网| 欧美成人在线网站| 欧美精品在线视频观看| 久久国产精品久久国产精品| 国产精品偷伦一区二区| 亚洲一级黄色av| 国产精品揄拍500视频| 亚洲一区二区三区xxx视频| 亚洲国产精品国自产拍av秋霞| 欧美最猛性xxxxx亚洲精品| 91人人爽人人爽人人精88v| 91国产在线精品| 欧美黑人狂野猛交老妇| 日韩在线免费观看视频| 精品福利在线看| 中文字幕在线日韩| 永久免费看mv网站入口亚洲| 国产精品高潮呻吟久久av无限| 欧美黄网免费在线观看| 亚洲国产私拍精品国模在线观看| 78m国产成人精品视频| 亚洲第一综合天堂另类专| 欧美激情一级二级| 最近2019中文字幕大全第二页| 8090理伦午夜在线电影| 久久久久久九九九| 中日韩美女免费视频网址在线观看| 成人久久精品视频| 成人网在线免费观看| 国产乱肥老妇国产一区二| 亚洲第一综合天堂另类专| 国产欧美一区二区三区久久| 91久久久久久久一区二区| 色偷偷噜噜噜亚洲男人的天堂| 九九精品在线观看| 夜夜嗨av色综合久久久综合网| 国产亚洲欧美日韩精品| 亚洲一区二区黄| 亚洲精品xxxx| 在线成人中文字幕| 久久影院模特热| 欧美日韩中文在线观看| 日韩在线一区二区三区免费视频| 国产精品九九九| 欧美成人中文字幕| 成人福利网站在线观看| 亚洲香蕉av在线一区二区三区| 7m精品福利视频导航| 亚洲女性裸体视频| 成人精品一区二区三区电影黑人| 欧美国产精品人人做人人爱| 欧美不卡视频一区发布| 国产亚洲视频在线观看| 日韩av电影在线播放| 在线观看欧美日韩| 日本一本a高清免费不卡| 美女久久久久久久久久久| 一区二区三区国产视频| 亚洲国产另类 国产精品国产免费| 97人人模人人爽人人喊中文字| 亚洲国产天堂久久综合网| 日韩中文字幕网| 久久久在线免费观看| 7m精品福利视频导航| 欧美一区第一页| 国产欧美婷婷中文| 亚洲的天堂在线中文字幕| 久久精品国产久精国产一老狼| 色妞久久福利网| 欧美日韩亚洲高清| 少妇高潮 亚洲精品| 国产又爽又黄的激情精品视频| 日韩欧美一区二区三区| 久久全国免费视频| 久久久97精品| 亚洲天堂日韩电影| 色爱精品视频一区| 精品国产91乱高清在线观看| 欧美一级免费看| 国产精品免费一区二区三区都可以| 97在线视频免费| 欧美黑人xxxⅹ高潮交| 国产精品户外野外| 欧美激情视频在线免费观看 欧美视频免费一| 久久久久久久久久久免费精品| 久久久久久高潮国产精品视| 日韩电影在线观看中文字幕| 中文字幕最新精品| 国产热re99久久6国产精品|