1:概述

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

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

常用知识点

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

2.基本操作

  1. 查找(search)
  2. 插入(insert)
  3. 删除(remove)

3:操作原理

  

查找

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

  以查找数值10为例

插入

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

以插入数值6为例

删除:

有四种情况:

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

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

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

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

5:完整代码

#include <stdio.h>
#include <stdlib.h>
struct TNode{
int data;
struct TNode *lt;
struct TNode *rt;
};
struct TNode* insrtTree(struct TNode *t,int key,int i);
void printTree(struct TNode *root);
struct TNode* delTree(struct TNode* t,int key);
int find(struct TNode* t,int key);
int arr[]={};
int main(){
int n,m;
int i,t;
scanf("%d%d",&n,&m);
struct TNode *root=NULL;
for(i=;i<n;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,);
printTree(root);
return ;
} int find(struct TNode* pt,int key){
if(pt==NULL)return NULL;
else if(pt->data==key)return ;
else if(pt->data>key) return find(pt->lt,key);
else if(pt->data<key) return find(pt->rt,key);
}
// 删除节点
struct TNode* delTree(struct TNode* pt,int key){
if(pt==NULL)return NULL;
else if(pt->data>key) pt->lt=delTree(pt->lt,key);//寻找左节点
else if(pt->data<key) pt->rt=delTree(pt->rt,key);//寻找右节点
// 找到节点 处理四种情况
else if(pt->lt==NULL){ // 当前节点无左节点
struct TNode* curt=pt->rt;
free(pt);
return curt;
}else if(pt->rt==NULL){// 当前节点无右节点
struct TNode* curt=pt->lt;
free(pt);
return curt;
}else if(pt->lt->rt==NULL){// 当前节点的左节点无右节点
struct TNode* curt=pt->lt;
curt->rt=pt->rt;
free(pt);
return curt;
}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);
return curt;
}
return pt;
}
struct TNode* insrtTree(struct TNode *t,int key,int i){
if(t==NULL){ //处理第一个节点 以及子节点为NULL情况
t=(struct TNode*)malloc(sizeof(struct TNode));
t->lt=t->rt=NULL;
t->data=key;
return t;
}
if(t->data>key){// 插入左子树情况
arr[i]=;
t->lt=insrtTree(t->lt,key,i);
}else{ // 插入右子树情况
arr[i]=;
t->rt=insrtTree(t->rt,key,i);
}
return t;
}
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 但是完善了代码

二叉搜索树BST(C语言实现可用)的更多相关文章

  1. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  2. 萌新笔记之二叉搜索树(BST)

    前言,以前搞过线段树,二叉树觉得也就那样= =.然后数据结构的课也没怎么听过,然后下周期中考... 本来以为今天英语考完可以好好搞ACM了,然后这个数据结构期中考感觉会丢人,还是好好学习一波. 二叉搜 ...

  3. 给定一个二叉搜索树(BST),找到树中第 K 小的节点

    问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点: 1. 基础数据结构的理解和编码能力 2.  递归使用 参考答案 ...

  4. 二叉搜索树 (BST) 的创建以及遍历

    二叉搜索树(Binary Search Tree) : 属于二叉树,其中每个节点都含有一个可以比较的键(如需要可以在键上关联值), 且每个节点的键都大于其左子树中的任意节点而小于右子树的任意节点的键. ...

  5. 在二叉搜索树(BST)中查找第K个大的结点之非递归实现

    一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...

  6. [LeetCode] Convert BST to Greater Tree 将二叉搜索树BST转为较大树

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  7. 二叉搜索树(BST)学习笔记

    BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...

  8. 二叉搜索树(BST)

    (第一段日常扯蛋,大家不要看)这几天就要回家了,osgearth暂时也不想弄了,毕竟不是几天就能弄出来的,所以打算过完年回来再弄.这几天闲着也是闲着,就掏出了之前买的算法导论看了看,把二叉搜索树实现了 ...

  9. hdu 3791:二叉搜索树(数据结构,二叉搜索树 BST)

    二叉搜索树 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

随机推荐

  1. drf框架中jwt认证,以及自定义jwt认证

    0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...

  2. postman动态数据获取

    1.以获取token(JWT)和uid为例 2.在登录接口的tests中写入代码(因为登录接口报文信息中有返回JWT和uid) 3.在其他接口中需要用到JWT和uid的地方设置变量{{JWT}}和{{ ...

  3. [BZOJ3449] [Usaco2014 Feb]Secret Code

    Description Farmer John has secret message that he wants to hide from his cows; the message is a str ...

  4. 聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别

    (上图是圣卡塔利娜岛,美国南加州的一个小岛,也是 mac OS 10.15 版本的官方默认壁纸) ___ 概述 Hello,大家好,我们又来讲面试中的基础题了,今天这是一道很经典又很猥琐的题 说猥琐是 ...

  5. python学习-列表、元组和字典(三)

    学习笔记中的源码:传送门 3.1 列表和元组 3.2 不同类型变量的初始化: 数值 digital_value = 0 字符串 str_value = "" 或 str_value ...

  6. MongoDB-系统时钟跳变引发的风波

    目录 背景 一. 对 oplog 的影响 oplog 原理 二.主备倒换 小结 声明:本文同步发表于 MongoDB 中文社区,传送门: http://www.mongoing.com/archive ...

  7. 高性能封装检测浏览器支持css3属性函数

    css3出来已经很久了,现在来谈判断浏览器是否支持某个css3的属性虽说有点过时了,但是还是可以谈谈的,然后,此篇主要谈的不是判断是否支持,而是怎么封装更好,为什么这么封装,欢迎吐槽. 入题,判断浏览 ...

  8. SQL挑战一 : 查找最晚入职员工的所有信息

    以上数据库表: CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_nam ...

  9. django-模型之从数据库获取数据(二)

    1.获取一条数据(字段值必须唯一) 2.条件查询filter 3.排除查询exclude 4.链式查询 5.查询后进行排序order_by 6.按字段查询values 7.插入数据create 8.数 ...

  10. Linux常见命令之文件处理命令

    ls命令 ls(选项)(参数) 选项 -a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出): -A:显示除影藏文件“.”和“..”以外的所有文件列表: -C:多列显示输出 ...