乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      AVL樹及其實現(xiàn)

       昵稱1740930 2012-03-30

      AVL樹及其實現(xiàn)

       引言
         平衡二叉樹由于logN的時間效率,在排序和查找中有重要應(yīng)用。

      實現(xiàn)
       形態(tài)勻稱的二叉樹稱為平衡二叉樹 (Balanced binary tree) ,其嚴(yán)格定義是:
       一棵空樹是平衡二叉樹;若 T 是一棵非空二叉樹,其左、右子樹為 TL 和 TR ,令 hl 和 hr 分別為左、右子樹的深度。當(dāng)且僅當(dāng)
        ?、賂L 、 TR 都是平衡二叉樹;
        ?、?| hl - hr |≤ 1;
      時,則 T 是平衡二叉樹。

      以下是它的c代碼實現(xiàn),具體思想?yún)⒁?lt;<數(shù)據(jù)結(jié)構(gòu)>>(嚴(yán)蔚敏)一書。
      #include <stdio.h>
      #include 
      <malloc.h>

      #define LH  1 //左高
      #define EH  0 //等高
      #define RH  -1//右高 
      #define TRUE 1
      #define FALSE 0

      typedef 
      int ElemType;
      typedef 
      struct BSTNode
      {
          ElemType key;
          
      int bf;
          
      struct BSTNode *lchild,*rchild;
      }
      BSTNode,*BSTree;  //平衡樹的定義
      //中序遍歷
      void InOrderTraverse(BSTree root)
      {
          
      if(root)
          
      {
              InOrderTraverse(root
      ->lchild);
              printf(
      "%d, ",root->key);
              InOrderTraverse(root
      ->rchild);
          }

      }

      //前序遍歷
      void PreOrderTraverse(BSTree root)
      {
          
      if(root)
          
      {
              printf(
      "%d, ",root->key);
              PreOrderTraverse(root
      ->lchild);
              PreOrderTraverse(root
      ->rchild);
          }

      }

      //右旋 如圖1
      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;
          
      switch(lc->bf)
          
      {
          
      case LH:
              T
      ->bf=lc->bf=EH;
              R_Rotate(T);
              
      break;
          
      case RH:
              BSTree rd
      =lc->rchild;
              
      switch(rd->bf)
              
      {
              
      case LH:     //如圖2所示
                  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;
          
      switch(rc->bf)
          
      {
          
      case RH:
              T
      ->bf=rc->bf=EH;
              L_Rotate(T);
              
      break;
          
      case LH:
              BSTree ld
      =rc->lchild;
              
      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;
          }

      }

      //在平衡二叉排序樹中插入一個結(jié)點
      int InsertAVL(BSTree &t,ElemType e,bool &taller)
      {
          
      if(!t)
          
      {
              t
      =(BSTree)malloc(sizeof(BSTNode));
              t
      ->key=e;
              t
      ->lchild=t->rchild=NULL;
              t
      ->bf=EH;
              taller
      =TRUE;
          }

          
      else
          
      {
              
      if(e==t->key)
              
      {
                  taller
      =FALSE;
                  
      return 0;
              }

              
      if(e<t->key)
              
      {
                  
      if(!InsertAVL(t->lchild,e,taller))
                      
      return 0;          //未插入
                  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(!InsertAVL(t->rchild,e,taller))
                      
      return 0;          //未插入
                  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 1;
      }

      //查找key,若沒找到,則返回NULL
      BSTree Search(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;
      }

      /**/
      int main(int argc,char *argv[])
      {
          BSTree root
      =NULL,r;
          
      bool taller=FALSE;
          
      int array[]={13,24,37,90,53};
          
      for(int i=0;i<5;i++)
              InsertAVL(root,array[i],taller);
          printf(
      "inorder traverse\n");
          InOrderTraverse(root);

          printf(
      "\npreorder traverse\n");
          PreOrderTraverse(root);

          printf(
      "\nsearch key\n");
          r
      =Search(root,37);
          
      if(r)
          
      {
              printf(
      "%d\n",r->key);
          }

          
      else
          
      {
              printf(
      "not find!\n");
          }

      }


      圖1.


      圖2
      輸出結(jié)果如下:

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多