二叉搜索树(BST)学习笔记
简介
二叉搜索树(\(Binary\ Search\ Tree\)),简称\(BST\),用于在一个集合中查找元素。
性质
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
- 它的左右子树也分别为二叉搜索树
具体操作
1、插入
操作内容:
将一个元素插入二叉搜索树。
操作方法:
将一个元素插入一个二叉搜索树,需要将插入元素与当前节点元素进行比较:
若插入元素等于当前节点元素,则说明已插入过该元素,退出函数。
若插入元素小于当前节点元素,如果当前节点左子树为空,则将该节点左子树定为当前插入元素,否则,继续对当前节点的左子树进行操作。
类似的,若插入元素大于当前节点元素,如果当前节点右子树为空,则将该节点右子树定为当前插入元素,否则,继续对当前节点的右子树进行操作。
代码如下:
void Insert(BST *&x,int v)
{
if(!x)//若当前节点为空
{
x=new BST;//新建一个节点
x->Left=x->Right=NULL,x->num=v;//将这个新节点设定为插入元素
return;
}
if(v==x->num) return;//若已插入过,则退出函数
if(v<x->num) Insert(x->Left,v);//若插入元素小于当前节点元素,则继续对当前节点的左子树进行操作
else Insert(x->Right,v);//反之,继续对当前节点的右子树进行操作
}
2、查询
操作内容:
查询一个元素是否在二叉搜索树中。
操作方法:
查询一个元素是否在二叉搜索树中,需要将查询元素与当前节点元素进行比较:
若查询元素等于当前节点元素,则返回1。
若查询元素小于当前节点元素,如果当前节点左子树为空,则返回0,否则,继续对当前节点的左子树进行操作。
类似的,若查询元素大于当前节点元素,如果当前节点右子树为空,则返回0,否则,继续对当前节点的右子树进行操作。
代码如下:
int Query(BST *x,int v)
{
if(!x) return 0;//若当前节点为空,则返回0
if(v==x->num) return 1;//若查询元素与当前节点相等,则返回1
return v<x->num?Query(x->Left,v):Query(x->Right,v);
}
3、删除
操作内容:
删除二叉搜索树中的一个元素。
操作方法:
删除二叉搜索树中的一个元素,需要将删除元素与当前节点元素进行比较:
若删除元素等于当前节点元素,如果当前节点无子树,则将当前节点设置为空,否则,将当前节点设置为当前节点的一个子树,操作完后退出函数。
若删除元素小于当前节点元素,如果当前节点左子树为空,则退出函数,否则,继续对当前节点的左子树进行操作。
类似的,若删除元素大于当前节点元素,如果当前节点右子树为空,则退出函数,否则,继续对当前节点的右子树进行操作。
具体代码如下:
void Delete(BST *&x,int v)
{
if(!x) return;//若当前节点为空,则退出函数
if(v==x->num) {x->Left->Right=x->Right,x=x->Left;return;}//删除当前节点
if(v<x->num) Delete(x->Left,v);
else Delete(x->Right,v);
}
完整代码
#include<bits/stdc++.h>
#define N 1000
using namespace std;
int Q;
struct BST
{
BST *Left,*Right;
int num;
}*rt=NULL;
void Insert(BST *&x,int v)
{
if(!x)//若当前节点为空
{
x=new BST;//新建一个节点
x->Left=x->Right=NULL,x->num=v;//将这个新节点设定为插入元素
return;
}
if(v==x->num) return;//若已插入过,则退出函数
if(v<x->num) Insert(x->Left,v);//若插入元素小于当前节点元素,则继续对当前节点的左子树进行操作
else Insert(x->Right,v);//反之,继续对当前节点的右子树进行操作
}
int Query(BST *x,int v)
{
if(!x) return 0;//若当前节点为空,则返回0
if(v==x->num) return 1;//若查询元素与当前节点相等,则返回1
return v<x->num?Query(x->Left,v):Query(x->Right,v);
}
void Delete(BST *&x,int v)
{
if(!x) return;//若当前节点为空,则退出函数
if(v==x->num) {x->Left->Right=x->Right,x=x->Left;return;}//删除当前节点
if(v<x->num) Delete(x->Left,v);
else Delete(x->Right,v);
}
int main()
{
scanf("%d",&Q);
for(int i=1;i<=Q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x==1) Insert(rt,y);
if(x==2) printf("%d\n",Query(rt,y));
if(x==3) Delete(rt,y);
}
return 0;
}
二叉搜索树(BST)学习笔记的更多相关文章
- 二叉搜索树(BST)学习笔记
BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...
- 萌新笔记之二叉搜索树(BST)
前言,以前搞过线段树,二叉树觉得也就那样= =.然后数据结构的课也没怎么听过,然后下周期中考... 本来以为今天英语考完可以好好搞ACM了,然后这个数据结构期中考感觉会丢人,还是好好学习一波. 二叉搜 ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- 给定一个二叉搜索树(BST),找到树中第 K 小的节点
问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点: 1. 基础数据结构的理解和编码能力 2. 递归使用 参考答案 ...
- 在二叉搜索树(BST)中查找第K个大的结点之非递归实现
一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...
- 二叉搜索树 (BST) 的创建以及遍历
二叉搜索树(Binary Search Tree) : 属于二叉树,其中每个节点都含有一个可以比较的键(如需要可以在键上关联值), 且每个节点的键都大于其左子树中的任意节点而小于右子树的任意节点的键. ...
- [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 ...
- 二叉搜索树(BST)
(第一段日常扯蛋,大家不要看)这几天就要回家了,osgearth暂时也不想弄了,毕竟不是几天就能弄出来的,所以打算过完年回来再弄.这几天闲着也是闲着,就掏出了之前买的算法导论看了看,把二叉搜索树实现了 ...
- hdu 3791:二叉搜索树(数据结构,二叉搜索树 BST)
二叉搜索树 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submiss ...
- 数据结构---二叉搜索树BST实现
1. 二叉查找树 二叉查找树(Binary Search Tree),也称为二叉搜索树.有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一 ...
随机推荐
- ASP.NET控件之RegularExpressValidator控件
作用:对Textbox或者其他输入框进行正则验证: 属性:ControlToValidate:要验证的控件: ErrorMessage:错误提示信息: ValidationExpression:正则表 ...
- 【转】C# String 前面不足位数补零的方法
源地址:http://www.cnblogs.com/zhangqs008/archive/2012/02/01/2341078.html
- 二进制数(dp,记忆化搜索)
二进制数(dp,记忆化搜索) 给定k个<=1e6的正整数x(k不大于10),问最小的,能被x整除且只由01组成的数. 首先,dp很好写.用\(f[i][j]\)表示i位01串,模ki的值是j的数 ...
- 魔卡少女(cardcaptor)——线段树
题目 [题目描述] 君君是中山大学的四年级学生.有一天在家不小心开启了放置在爸爸书房中的一本古书.于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地.这时 ...
- Eclipse中Android公共库的正确建立及调用方法(转)
转自http://www.cnblogs.com/SkyD/archive/2011/09/01/2161502.html 引言 之前一直头痛于没有办法在多个程序中共享资源,用作公共类库的方法也是使用 ...
- 避免picture图片无法删除,提示正在被其他进程使用
pictureBox1.Image = Image.FromStream(ByteToStream(SetImageToByteArray(cutImgPath))); #region 将文件转换成流 ...
- 洛谷P1057 传球游戏(记忆化搜索)
点我进入题目 题目大意:n个小孩围一圈传球,每个人可以给左边的人或右边的人传球,1号小孩开始,一共传m次,请问有多少种可能的路径使球回到1号小孩. 输入输出:输入n,m,输出路径的数量. 数据范围:4 ...
- deep copy and shallow copy
链接A:浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值.但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件..当值拷贝的时候,两个对象就有用共同的资源,同时对资 ...
- Java文件与io——复制文件和转换流
字节流与字符流的区别 在所有的流操作里,字节永远是最基础的.任何基于字节的操作都是正确的.无论是文本文件还是二进制的文件. 如果确认流里面只有可打印的字符,包括英文的和各种国家的文字,也包括中文,那么 ...
- Java面向对象_常用类库api——二叉树数据结构实现
二叉树是每个节点最多有两个子树的有序树.通常子树被称为"左子树"和"右子树". 二叉树算法的排序规则: 1.选择第一个元素作为根节点 2.之后如果元素大于根节点 ...