搜索c语言代码,二叉搜索树BST(C语言实现可用)(示例代码)

1:概述

搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用作字典或优先级队列。二叉搜索树是最简单的搜索树。其左子树的键值<=根节点的键值,右子树的键值>=根节点的键值。

如果共有n个元素,那么每次操作需要的O(log n)的时间.

3ea64702ffd56fa36820878ed0c2c8e7.png

常用知识点

满二叉树 : 一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。

完全二叉树 : 而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层要么是满的,要么在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2^(k-1)个叶子节点,至多有2^k-1个节点。

2.基本操作

查找(search)

插入(insert)

删除(remove)

3:操作原理

查找

假设查找的值为x,从根节点的值开始比对,如果小于根节点的值,则往左儿子继续查找,如果大于根节点的值,则往右儿子继续查找.依次类推.直到当前节点的值等于要查找的值.

d69176030a3aa58af3ec782bb002f5a7.png

以查找数值10为例

插入

按照查找的步骤即可找到插入值应该在的位置

f1b78c0113dd8b9321e753823b7140d7.png

以插入数值6为例

删除:

有四种情况:

1: // 当前节点无左节点 ,右字节点7覆盖5,

0801dd59619fc300caf1b4ab9bd6da5e.png

: 3: // 当前节点无右节点 ,右字节点7覆盖5,

2cb81278df900099626b46af2e6f2b20.png

: 4: // 删除节点5的左节点没有右节点, 只需要8作为3的右节点 ,3节点覆盖5

d8ad80373cf5f42ba3c4167d9cc80050.png

: 2:  如果以上3中情况都没有,只需要寻找当前节点的左节点的所有字节点的最大值,用最大值填充5节点 4填充5

6abdad6276c5b3f328af5df95c177e15.png

5:完整代码

#include #include

structTNode{intdata;struct TNode *lt;struct TNode *rt;

};struct TNode* insrtTree(struct TNode *t,int key,inti);void printTree(struct TNode *root);struct TNode* delTree(struct TNode* t,intkey);int find(struct TNode* t,intkey);int arr[1000]={0};intmain(){intn,m;inti,t;

scanf("%d%d",&n,&m);struct TNode *root=NULL;for(i=0;i

scanf("%d",&arr[i]);

root=insrtTree(root,arr[i],i);

}//t=arr[m-1];

/*if(arr[m-1]==0){

printf("Right child");

}else{

printf("Light child");

}*/root=delTree(root,10);

printTree(root);return 0;

}int find(struct TNode* pt,intkey){if(pt==NULL)returnNULL;else if(pt->data==key)return 1;else if(pt->data>key) return find(pt->lt,key);else if(pt->datart,key);

}//删除节点

struct TNode* delTree(struct TNode* pt,intkey){if(pt==NULL)returnNULL;else if(pt->data>key) pt->lt=delTree(pt->lt,key);//寻找左节点

else if(pt->datart=delTree(pt->rt,key);//寻找右节点//找到节点 处理四种情况

else if(pt->lt==NULL){ //当前节点无左节点

struct TNode* curt=pt->rt;free(pt);returncurt;

}else if(pt->rt==NULL){//当前节点无右节点

struct TNode* curt=pt->lt;free(pt);returncurt;

}else if(pt->lt->rt==NULL){//当前节点的左节点无右节点

struct TNode* curt=pt->lt;

curt->rt=pt->rt;free(pt);returncurt;

}else{//以上不满足就把左儿子的子孙中最大的节点, 即右子树的右子树的...右子树,//提到需要删除的节点位置

struct TNode*p;for(p=pt->lt;p->rt->rt!=NULL;p=p->rt);struct TNode* curt=p->lt;

p->rt=curt->rt;

curt->lt=pt->lt;

curt->rt=pt->rt;free(p);returncurt;

}returnpt;

}struct TNode* insrtTree(struct TNode *t,int key,inti){if(t==NULL){ //处理第一个节点 以及子节点为NULL情况

t=(struct TNode*)malloc(sizeof(structTNode));

t->lt=t->rt=NULL;

t->data=key;returnt;

}if(t->data>key){//插入左子树情况

arr[i]=1;

t->lt=insrtTree(t->lt,key,i);

}else{ //插入右子树情况

arr[i]=0;

t->rt=insrtTree(t->rt,key,i);

}returnt;

}void printTree(struct TNode *root){if(root==NULL)return;

printf("%d",root->data);

printTree(root->lt);

printTree(root->rt);

}

说明: 本身学习了 https://blog.csdn.net/li_l_il/article/details/88677927 但是完善了代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值