<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • C語言中怎么實(shí)現(xiàn)一個平衡二叉樹

            這篇文章將為大家詳細(xì)講解有關(guān)C語言中怎么實(shí)現(xiàn)一個平衡二叉樹,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

            主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站建設(shè)、程序開發(fā)、微網(wǎng)站、小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站設(shè)計、成都做網(wǎng)站、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運(yùn)作于一體,具備承接不同規(guī)模與類型的建設(shè)項目的能力。

            數(shù)據(jù)結(jié)構(gòu)平衡二叉樹

            參考代碼如下:

            #include <stdio.h> 
            #include <malloc.h> 
            #include <windows.h> 
            #define LH +1  // 左高  
            #define EH 0  // 等高  
            #define RH -1  // 右高  
            #define N 5   // 數(shù)據(jù)元素個數(shù)  
             
            typedef char KeyType; // 設(shè)關(guān)鍵字域為字符型  
             
            typedef struct 
            { 
              KeyType key; 
              int order; 
            }ElemType; // 數(shù)據(jù)元素類型  
             
            // 平衡二叉樹的類型  
            typedef struct BSTNode 
            { 
              ElemType data; 
              // bf結(jié)點(diǎn)的平衡因子,只能夠取0,-1,1,它是左子樹的深度減去 
              // 右子樹的深度得到的 
              int bf;  
              struct BSTNode *lchild,*rchild; // 左、右孩子指針  
            }BSTNode,*BSTree; 
             
            // 構(gòu)造一個空的動態(tài)查找表DT 
            int InitDSTable(BSTree *DT)  
            { 
              *DT=NULL; 
              return 1; 
            } 
             
            // 銷毀動態(tài)查找表DT  
            void DestroyDSTable(BSTree *DT)  
            { 
              if(*DT) // 非空樹  
              { 
                if((*DT)->lchild) // 有左孩子  
                  DestroyDSTable(&(*DT)->lchild); // 銷毀左孩子子樹  
                if((*DT)->rchild) // 有右孩子  
                  DestroyDSTable(&(*DT)->rchild); // 銷毀右孩子子樹  
                free(*DT); // 釋放根結(jié)點(diǎn)  
                *DT=NULL; // 空指針賦0  
              } 
            } 
             
            // 在根指針T所指二叉排序樹中遞歸地查找某關(guān)鍵字等于key的數(shù)據(jù)元素,  
            // 若查找成功,則返回指向該數(shù)據(jù)元素結(jié)點(diǎn)的指針,否則返回空指針。 
            BSTree SearchBST(BSTree T,KeyType key) 
            { 
              if((!T)|| (key == T->data.key)) 
                return T; // 查找結(jié)束  
              else if(key < T->data.key) // 在左子樹中繼續(xù)查找  
                return SearchBST(T->lchild,key); 
              else 
                return SearchBST(T->rchild,key); // 在右子樹中繼續(xù)查找  
            } 
             
            // 對以*p為根的二叉排序樹作右旋處理,處理之后p指向新的樹根結(jié)點(diǎn),即旋轉(zhuǎn)  
            // 處理之前的左子樹的根結(jié)點(diǎn)。 
            void R_Rotate(BSTree *p) 
            { 
              BSTree lc; 
              lc=(*p)->lchild; // lc指向p的左子樹根結(jié)點(diǎn)  
              (*p)->lchild=lc->rchild; // lc的右子樹掛接為p的左子樹  
              lc->rchild=*p; 
              *p=lc; // p指向新的根結(jié)點(diǎn)  
            } 
             
            // 對以*p為根的二叉排序樹作左旋處理,處理之后p指向新的樹根結(jié)點(diǎn),即旋轉(zhuǎn)  
            // 處理之前的右子樹的根結(jié)點(diǎn)。 
            void L_Rotate(BSTree *p) 
            { 
              BSTree rc; 
              rc=(*p)->rchild; // rc指向p的右子樹根結(jié)點(diǎn)  
              (*p)->rchild=rc->lchild; // rc的左子樹掛接為p的右子樹  
              rc->lchild=*p; 
              *p=rc; // p指向新的根結(jié)點(diǎn)  
            } 
             
            // 對以指針T所指結(jié)點(diǎn)為根的二叉樹作左平衡旋轉(zhuǎn)處理,本算法結(jié)束時,  
            // 指針T指向新的根結(jié)點(diǎn)。 
            void LeftBalance(BSTree *T) 
            {   
              BSTree lc,rd; 
              lc=(*T)->lchild; // lc指向*T的左子樹根結(jié)點(diǎn)  
              switch(lc->bf) 
              { // 檢查*T的左子樹的平衡度,并作相應(yīng)平衡處理  
              case LH: // 新結(jié)點(diǎn)插入在*T的左孩子的左子樹上,要作單右旋處理  
                (*T)->bf=lc->bf=EH; 
                R_Rotate(T); 
                break; 
              case RH: // 新結(jié)點(diǎn)插入在*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所指結(jié)點(diǎn)為根的二叉樹作右平衡旋轉(zhuǎn)處理,本算法結(jié)束時,  
            // 指針T指向新的根結(jié)點(diǎn) 
            void RightBalance(BSTree *T) 
            { 
              BSTree rc,rd; 
              rc=(*T)->rchild; // rc指向*T的右子樹根結(jié)點(diǎn)  
              switch(rc->bf) 
              { // 檢查*T的右子樹的平衡度,并作相應(yīng)平衡處理  
              case RH: // 新結(jié)點(diǎn)插入在*T的右孩子的右子樹上,要作單左旋處理  
                (*T)->bf=rc->bf=EH; 
                L_Rotate(T); 
                break; 
              case LH: // 新結(jié)點(diǎn)插入在*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有相同關(guān)鍵字的結(jié)點(diǎn),則插入一個  
            // 數(shù)據(jù)元素為e的新結(jié)點(diǎn),并返回1,否則返回0。若因插入而使二叉排序樹  
            // 失去平衡,則作平衡旋轉(zhuǎn)處理,布爾變量taller反映T長高與否。  
            int InsertAVL(BSTree *T,ElemType e,int *taller) 
            { 
              if(!*T) 
              { // 插入新結(jié)點(diǎn),樹“長高”,置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有相同關(guān)鍵字的結(jié)點(diǎn)則不再插入  
                  *taller=0; 
                  return 0; 
                } 
                if(e.key < (*T)->data.key) 
                { // 應(yīng)繼續(xù)在*T的左子樹中進(jìn)行搜索  
                  if(!InsertAVL(&(*T)->lchild,e,taller)) // 未插入  
                    return 0; 
                  if(*taller) 
                    // 已插入到*T的左子樹中且左子樹“長高”  
                    switch((*T)->bf) // 檢查*T的平衡度  
                    { 
                    case LH: 
                      // 原本左子樹比右子樹高,需要作左平衡處理  
                      LeftBalance(T); 
                      *taller=0; //標(biāo)志沒長高 
                      break; 
                    case EH: 
                      // 原本左、右子樹等高,現(xiàn)因左子樹增高而使樹增高  
                      (*T)->bf=LH; 
                      *taller=1; //標(biāo)志長高 
                      break; 
                    case RH: 
                      // 原本右子樹比左子樹高,現(xiàn)左、右子樹等高 
                      (*T)->bf=EH;  
                      *taller=0; //標(biāo)志沒長高 
                  } 
                } 
                else 
                { 
                  // 應(yīng)繼續(xù)在*T的右子樹中進(jìn)行搜索  
                  if(!InsertAVL(&(*T)->rchild,e,taller)) // 未插入  
                    return 0; 
                  if(*taller) // 已插入到T的右子樹且右子樹“長高”  
                    switch((*T)->bf) // 檢查T的平衡度  
                  { 
                  case LH:  
                    (*T)->bf=EH; // 原本左子樹比右子樹高,現(xiàn)左、右子樹等高  
                    *taller=0; 
                    break; 
                  case EH: // 原本左、右子樹等高,現(xiàn)因右子樹增高而使樹增高  
                    (*T)->bf=RH; 
                    *taller=1; 
                    break; 
                  case RH: // 原本右子樹比左子樹高,需要作右平衡處理  
                    RightBalance(T); 
                    *taller=0; 
                  } 
                } 
              } 
              return 1; 
            } 
             
            // 按關(guān)鍵字的順序?qū)T的每個結(jié)點(diǎn)調(diào)用函數(shù)Visit()一次 
            void TraverseDSTable(BSTree DT,void(*Visit)(ElemType)) 
            {  
              if(DT) 
              { 
                TraverseDSTable(DT->lchild,Visit); // 先中序遍歷左子樹  
                Visit(DT->data); // 再訪問根結(jié)點(diǎn)  
                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); // 按關(guān)鍵字順序遍歷二叉樹  
              printf("\n請輸入待查找的關(guān)鍵字: "); 
              scanf("%d",&j); 
              p=SearchBST(dt,j); // 查找給定關(guān)鍵字的記錄  
              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) 
            請輸入待查找的關(guān)鍵字: 53 
            (53,5) 
            請按任意鍵繼續(xù). . .  
             
            */

            運(yùn)行結(jié)果如下:

            C語言中怎么實(shí)現(xiàn)一個平衡二叉樹

            關(guān)于C語言中怎么實(shí)現(xiàn)一個平衡二叉樹就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

            網(wǎng)頁題目:C語言中怎么實(shí)現(xiàn)一個平衡二叉樹
            URL地址:http://www.jbt999.com/article14/ppjige.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化動態(tài)網(wǎng)站、移動網(wǎng)站建設(shè)、定制開發(fā)、云服務(wù)器

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

            成都seo排名網(wǎng)站優(yōu)化

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 影音先锋AV黄色免费电影! | 天天弄天天模 | 91福利国产色久麻豆 | 色五月婷婷六月丁香 | 夜夜骚网站 |