简介

二叉搜索树(\(Binary\ Search\ Tree\)),简称\(BST\),用于在一个集合中查找元素。

性质

  1. 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  2. 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  3. 它的左右子树也分别为二叉搜索树

具体操作

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)学习笔记的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. [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 ...

  8. 二叉搜索树(BST)

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

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

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

  10. 数据结构---二叉搜索树BST实现

    1. 二叉查找树 二叉查找树(Binary Search Tree),也称为二叉搜索树.有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一 ...

随机推荐

  1. uoj #185. 【ZJOI2016】小星星

    #185. [ZJOI2016]小星星 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有 nn 颗小星星,用 mm 条彩色的细线串了起来,每条细线连着两颗小星星.有一天她发现,她的饰品被破坏 ...

  2. 洛谷P1054 等价表达式

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  3. ldap第二天-yum安装LDAP + phpLDAPadmin

    1.安装LDAP服务器和客户端,migrationtools工具包 yum install -y openldap-servers openldap-clients migrationtools 2. ...

  4. 找出list中的不同元素、删除两个list中相同的对象

    package com.test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; ...

  5. Flask&&人工智能AI --3

    一.flask中的CBV 对比django中的CBV,我们来看一下flask中的CBV怎么实现? from flask import Flask, render_template, url_for, ...

  6. Linux如何用查看域名解析

    方法/步骤     查看本地dns配置.确保能上网,dns配置正确.可以查看网卡配置文件和dns配置文件,网卡里配置优先.   ping命令.第一行会返回域名及解析的ip.   host命令.会返回域 ...

  7. Android中常用的几种加密

    1.数字摘要 是指通过算法将长数据变为短数据,通常用来标识数据的唯一性,是否被修改,常用的加密算法有md5和sha1两种,如Android的App签名也是用的这两种算法. md5具有不可逆性,也可用来 ...

  8. vnc安装问题

    在xenserver中安装vncserver软件.启动显示正常 用grep命令查看也确实有线程在运行. 但实际上用命令service vncserver status查看vnc状态,显示没有桌面在运行 ...

  9. Windows下使用nvm管理多个Node.js 版本

    下载 https://github.com/coreybutler/nvm-windows/releases 安装       配置 使用 # nvm install 版本号   # nvm list ...

  10. 寻找jar包的方法

    在项目开发中经常会遇到资源jar查找难的问题,一种使用maven ,另一种方法是: (1).使用下载地址:https://oss.sonatype.org/content/repositories/r ...