C语言二叉排序(搜索)树实例

 更新时间:2017年10月21日 14:14:13   作者:数星星的咚咚咚  
这篇文章主要为大家详细介绍了C语言二叉排序树实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言二叉排序(搜索)树实例代码,供大家参考,具体内容如下

/**1.实现了递归 非递归插入(创建)二叉排序(搜索)树;
分别对应Insert_BinSNode(TBinSNode* T,int k),NonRecursion_Insert_BinSNode(TBinSNode* T,int k);
  2.实现了递归 非递归查找 二叉排序(搜索)树 ;
分别对应Find_BinSNode(TBinSNode *T,int s),NonRecursion_Find_BinSNode(TBinSNode *T,int s);
  3. 实现了非递归删除 二叉排序(搜索)树;
分别对应Delete_BinSNode(); 
  4. 实现了递归先序、中序、后序遍历二叉排序(搜索)树;
分别对应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.这里再次实现一遍查找,当然也可以修改一下Find类的函数 
  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");
  }
  //如果找到待删除的结点,立刻判断该结点有无左子树

  //情况一:待删除结点无左子树 
  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;
    }
  } 
  //情况二:待删除的结点有左子树。 
  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; //该左子树中最大的结点的前一个结点. 
        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);
  }

} 
/*-----------------递归方法 创建/插入 二叉排序树------------------*/ 
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); 
  }
}
/*---------------------非递归 创建/插入 二叉排序树---------------------------*/
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;//创建的 查找的 删除的 
  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;
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++程序的执行顺序结构以及关系和逻辑运算符讲解

    C++程序的执行顺序结构以及关系和逻辑运算符讲解

    这篇文章主要介绍了C++程序的执行顺序结构以及关系和逻辑运算符讲解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++计算图任意两点间的所有路径

    C++计算图任意两点间的所有路径

    这篇文章主要为大家详细介绍了C++求图任意两点间的所有路径 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Visual Studio 2019 DLL动态库连接实例(图文教程)

    Visual Studio 2019 DLL动态库连接实例(图文教程)

    这篇文章主要介绍了Visual Studio 2019 DLL动态库连接实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • c++定义全局变量详解

    c++定义全局变量详解

    这篇文章主要给大家介绍了C++语言中定义全局变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2021-10-10
  • 利用Matlab制作抖音同款含褶皱面料图

    利用Matlab制作抖音同款含褶皱面料图

    这篇文章主要介绍了如何利用Matlab制作抖音的同款含褶皱面料图,文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下
    2022-03-03
  • C++编程之CString、string与、char数组的转换

    C++编程之CString、string与、char数组的转换

    这篇文章主要介绍了C++编程之CString、string与、char数组的转换的相关资料,希望通过本文能帮助到大家,让大家学习理解这部分内容,需要的朋友可以参考下
    2017-10-10
  • 关于VS2019 C++项目同时出现LNK2005 和LNK1169 error 的解决办法

    关于VS2019 C++项目同时出现LNK2005 和LNK1169 error 的解决办法

    这篇文章主要介绍了关于VS2019 C++项目同时出现LNK2005 和LNK1169 error 的解决办法,本文给大家介绍的非常详细,对大家的学习工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • opencv3/C++ PHash算法图像检索详解

    opencv3/C++ PHash算法图像检索详解

    今天小编就为大家分享一篇opencv3/C++ PHash算法图像检索详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • OpenCV实现图像校正功能

    OpenCV实现图像校正功能

    这篇文章主要为大家详细介绍了OpenCV实现图像校正功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • C++ 类的友元机制解读

    C++ 类的友元机制解读

    这篇文章主要介绍了C++ 类的友元机制的相关资料,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-02-02

最新评论