最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言二叉排序(搜索)樹實(shí)例

 更新時(shí)間:2017年10月21日 14:14:13   作者:數(shù)星星的咚咚咚  
這篇文章主要為大家詳細(xì)介紹了C語言二叉排序樹實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言二叉排序(搜索)樹實(shí)例代碼,供大家參考,具體內(nèi)容如下

/**1.實(shí)現(xiàn)了遞歸 非遞歸插入(創(chuàng)建)二叉排序(搜索)樹;
分別對(duì)應(yīng)Insert_BinSNode(TBinSNode* T,int k),NonRecursion_Insert_BinSNode(TBinSNode* T,int k);
  2.實(shí)現(xiàn)了遞歸 非遞歸查找 二叉排序(搜索)樹 ;
分別對(duì)應(yīng)Find_BinSNode(TBinSNode *T,int s),NonRecursion_Find_BinSNode(TBinSNode *T,int s);
  3. 實(shí)現(xiàn)了非遞歸刪除 二叉排序(搜索)樹;
分別對(duì)應(yīng)Delete_BinSNode(); 
  4. 實(shí)現(xiàn)了遞歸先序、中序、后序遍歷二叉排序(搜索)樹;
分別對(duì)應(yīng)Pre_Print_BinSNode(TBinSNode T),In_Print_BinSNode(TBinSNode T),Post_Print_BinSNode(TBinSNode T);    
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct BinSTreeNode{
  int num;
  struct BinSTreeNode *lchild,*rchild;
}BinSNode,*TBinSNode;
int Empty_Tree(TBinSNode T){
  if(!T){
    return 1; 
  }else{
    return 0;
  }
}

/*---------------------非遞歸方法 二叉排序樹的刪除-----------------*/
void Delete_BinSNode(TBinSNode *T,int del){
  TBinSNode cur,pre,lt,rblast; 
  cur=*T;
  pre=NULL;
  //如果二叉排序樹為空 
  if(Empty_Tree(cur)){
    printf("Sorry,Tree is none"); 
    return;
  }
//如果二叉排序樹不為空,先找到即將刪除的元素del.這里再次實(shí)現(xiàn)一遍查找,當(dāng)然也可以修改一下Find類的函數(shù) 
  while(cur && cur->num!=del){
    if(del>cur->num){
      pre=cur; 
      cur=cur->rchild;
    }else{
      pre=cur;
      cur=cur->lchild;
    }
  }
  if(!cur){
    printf("Sorry,you want to delete the node ,which is non-existent");
    return;
  }
  if(cur->num==del){
    printf("find the delete node,wait a minute.......\n");
  }
  //如果找到待刪除的結(jié)點(diǎn),立刻判斷該結(jié)點(diǎn)有無左子樹

  //情況一:待刪除結(jié)點(diǎn)無左子樹 
  if(!cur->lchild){
    if(pre==NULL){
      cur=*T;
      *T=(*T)->rchild;
      free(cur);
      return;
    }
    if(pre->lchild && pre->lchild->num==del){
      pre->lchild=cur->rchild;
      free(cur);
      return;
    }
    if(pre->rchild && pre->rchild->num==del){
      pre->rchild=cur->rchild;
      free(cur);
      return;
    }
  } 
  //情況二:待刪除的結(jié)點(diǎn)有左子樹。 
  if(cur->lchild){
    lt=cur->lchild;
    //情況2.1:該左子樹無右子樹 
    if(!lt->rchild){
      if(pre->lchild && pre->lchild->num==del){
        pre->lchild=lt;
        free(cur);
        return;
      }
      if(pre->rchild && pre->rchild->num==del){
        pre->rchild=lt;
        free(cur);
        return;
      }
    }  
    //情況2.2:該左子樹有右子樹 
    if(lt->rchild){
      while(lt->rchild){
        rblast=lt; //該左子樹中最大的結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn). 
        lt=lt->rchild; 
      }
      cur->num=lt->num;
      rblast->rchild=lt->lchild;
      free(lt);
      return;
    }  
  }
} 



/*--------------------遞歸方法 查找 二叉排序樹-------------------*/
void Find_BinSNode(TBinSNode T,int s){
  if(s==T->num){
    printf("%d\n",T->num);
    return;
  }
  if(s>T->num){
    Find_BinSNode(T->rchild,s);
  }else{
    Find_BinSNode(T->lchild,s);
  }
} 
/*-------------------非遞歸方法 查找二叉排序樹--------------------*/
void NonRecursion_Find_BinSNode(TBinSNode T,int s){
  if(Empty_Tree(T)){
    printf("Tree is none");
    return; 
  }
  while(T && s!=T->num ){
    if(s>T->num){
      T=T->rchild;
    }else{
      T=T->lchild;    
    }  
  }
  if(!T){
    printf("Sorry,Not Find!");
    exit(0);
  }
  if(s==T->num){
    printf("%d\n",T->num);
  }

} 
/*-----------------遞歸方法 創(chuàng)建/插入 二叉排序樹------------------*/ 
void Insert_BinSNode(TBinSNode *T,int k){
// int n;
  TBinSNode node;
// scanf("%d",&n);
  if(Empty_Tree(*T)){
    *T=(TBinSNode)malloc(sizeof(BinSNode)); 
    (*T)->num=k;
    (*T)->lchild=(*T)->rchild=NULL;
    return;
  }else{
    if(k>(*T)->num){
      Insert_BinSNode(&(*T)->rchild,k); 
    }else{
      Insert_BinSNode(&(*T)->lchild,k); 
    }
  }  
}
/*----------------------先序遍歷二叉排序樹----------------------------------*/
void Pre_Print_BinSNode(TBinSNode T){
  if(T){
    printf("%d ",T->num);
    Pre_Print_BinSNode(T->lchild);
    Pre_Print_BinSNode(T->rchild); 
  }
}
/*-----------------------中序遍歷二叉排序樹-----------------------------------*/
void In_Print_BinSNode(TBinSNode T){
  if(T){
    In_Print_BinSNode(T->lchild);
    printf("%d ",T->num);
    In_Print_BinSNode(T->rchild); 
  }
}

/*-----------------------后序遍歷二叉排序樹-----------------------------------*/
void Post_Print_BinSNode(TBinSNode T){
  if(T){
    Post_Print_BinSNode(T->lchild);
    Post_Print_BinSNode(T->rchild);
    printf("%d ",T->num); 
  }
}
/*---------------------非遞歸 創(chuàng)建/插入 二叉排序樹---------------------------*/
void NonRecursion_Insert_BinSNode(TBinSNode *T,int k){
  //如果為空的二叉排序樹 
  TBinSNode cur,p,t;
  t=*T;
  if(!*T){
    *T=(TBinSNode)malloc(sizeof(BinSNode));
    (*T)->num=k;
    (*T)->lchild=(*T)->rchild=NULL;
    return; 
  }else{     //二叉排序樹不為空。
    while(t){
      if(k>t->num){
        cur=t;
        t=t->rchild;
      }else{
        cur=t;
        t=t->lchild;
      } 
    }
     p=(TBinSNode)malloc(sizeof(BinSNode));
     p->num=k;
     p->lchild=p->rchild=NULL;
     if(k>cur->num){
      cur->rchild=p;
     } 
     if(k<cur->num){
      cur->lchild=p;
     }
  }
} 
int main(void){
  TBinSNode T=NULL;
  int k,s,del;//創(chuàng)建的 查找的 刪除的 
  while(scanf("%d",&k) && k){
//   Insert_BinSNode(&T,k);
    NonRecursion_Insert_BinSNode(&T,k); 
  }
// scanf("%d",&s); 
// Find_BinSNode(T,s);
// NonRecursion_Find_BinSNode(T,s); 
  Pre_Print_BinSNode(T);
  scanf("%d",&del);
  Delete_BinSNode(&T,del);
  Pre_Print_BinSNode(T); 
  return 0;
} 

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于QT實(shí)現(xiàn)顯示OpenCV讀取的圖片

    基于QT實(shí)現(xiàn)顯示OpenCV讀取的圖片

    OpenCV自帶了一部分常用的GUI功能,但是更多的圖像處理功能需要其他GUI框架來輔助實(shí)現(xiàn),本文將通過QT來顯示OpenCV讀取的圖片,需要的可以參考一下
    2022-11-11
  • C語言?模擬實(shí)現(xiàn)strlen函數(shù)詳解

    C語言?模擬實(shí)現(xiàn)strlen函數(shù)詳解

    在 C 語言 中我們要獲取 字符串 的長度,可以使用strlen 函數(shù),strlen 函數(shù)計(jì)算字符串的長度時(shí),直到空結(jié)束字符,但不包括空結(jié)束字符,因?yàn)?nbsp;strlen 函數(shù)時(shí)不包含最后的結(jié)束字符的,因此一般使用 strlen函數(shù)計(jì)算的字符串的長度會(huì)比使用 sizeof 計(jì)算的字符串的字節(jié)數(shù)要小
    2022-04-04
  • 利用C語言編寫一個(gè)無限循環(huán)語句

    利用C語言編寫一個(gè)無限循環(huán)語句

    這篇文章主要介紹了利用C語言編寫一個(gè)無限循環(huán)語句問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++ CTreeview的checkbox使用方法

    C++ CTreeview的checkbox使用方法

    這篇文章主要介紹了C++ CTreeview的checkbox使用方法的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C++ 算法精講之貪心算法

    C++ 算法精講之貪心算法

    貪心算法(又稱貪婪算法)是指,在對(duì)問題求解時(shí),總是做出在當(dāng)前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解
    2022-03-03
  • Objective-C不帶加減號(hào)的方法實(shí)例

    Objective-C不帶加減號(hào)的方法實(shí)例

    顯而易見的事實(shí)是,Objective-C 中,+ 表示類方法,- 表示實(shí)例方法,這篇文章主要給大家介紹了關(guān)于Objective-C不帶加減號(hào)的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • cmake添加一個(gè)庫的實(shí)現(xiàn)步驟

    cmake添加一個(gè)庫的實(shí)現(xiàn)步驟

    本文主要介紹了cmake添加一個(gè)庫的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C++實(shí)現(xiàn)簡(jiǎn)單的通訊錄管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單的通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單的通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 深入分析父子線程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果

    深入分析父子線程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果

    本篇文章是對(duì)父子線程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn)堆排序?qū)嵗榻B

    C++實(shí)現(xiàn)堆排序?qū)嵗榻B

    大家好,本篇文章主要講的是C++實(shí)現(xiàn)堆排序?qū)嵗榻B,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評(píng)論

伽师县| 手机| 合水县| 耿马| 南部县| 土默特右旗| 兰考县| 天津市| 炉霍县| 宁蒗| 凤城市| 开封县| 黄平县| 临海市| 元谋县| 南充市| 永平县| 北京市| 大同市| 东乌珠穆沁旗| 阿拉尔市| 西安市| 麦盖提县| 莲花县| 新化县| 宝鸡市| 蓬溪县| 开化县| 精河县| 宁陵县| 沁源县| 武清区| 左贡县| 清流县| 阳春市| 合水县| 德惠市| 平武县| 哈巴河县| 祥云县| 孝义市|