二叉搜索树(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),是指一 ...
随机推荐
- 原生 Ajax 封装 和 Axios 二次 封装
AJAX 异步的JavaScript与XML技术( Asynchronous JavaScript and XML ) Ajax 不需要任何浏览器插件,能在不更新整个页面的前提下维护数据,但需要用户允 ...
- react native ios打包,即生产包
参考文章:http://www.devio.org/2017/02/09/React-Native%E5%8F%91%E5%B8%83APP%E4%B9%8B%E6%89%93%E5%8C%85iOS ...
- Django反向解析与分组命名
1.图书管理系统中使用分组或命名分组.URL的命名和反向解析: 2.删除功能三合一: urls.py文件 from app_book import views urlpatterns = [ url( ...
- What is Data Driven Testing? Learn to create Framework
What is Data Driven Testing? Data-driven is a test automation framework which stores test data in a ...
- 使用Collectd + InfluxDB + Grafana进行JMX监控
我们已经看到使用Collectd监控CPU /内存利用率(本文).但它没有提供所有信息来确定性能问题的瓶颈.在本文中,我们将使用Collectd Java插件来使用其JMX技术来监视和管理Java虚拟 ...
- Telerik RadPropertyGrid 设置显隐 Combox选择
Telerik RadPropertyGrid 的排序按钮.搜索框和描述面板的显隐只要设置SortAndGroupButtons.SearchBox.DescriptionPanel的属性值改为Vis ...
- Linux网络编程函数
1. Server端-socket/bind/listen/accept/read socket(AF_INET, SOCK_STREAM, 0); //指定端口,内核将端口上的数据转发给该socke ...
- matlab 文件打开设置
平台 macOS MATLAB 版本 matlab 2017a 需要设置文件打开编码的情况 从windows平台迁移过来的.m文件的编码格式是GB2312的, 而macOS的MATLAB默认是UTF- ...
- HDU 5465——Clarke and puzzle——————【树状数组BIT维护前缀和+Nim博弈】
Clarke and puzzle Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- .net 向新页面跳转的语句
1. href='##' onclick=\"window.open('../DataSplit/DrugInfo_ManualVersionViewNew.aspx?id=" + ...