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语言二叉排序(搜索)树实例 的全部内容, 来源链接: utcz.com/z/349789.html

回到顶部