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


    简介

    二叉搜索树\(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;
    }
    
    败得义无反顾,弱得一无是处
  • 相关阅读:
    oracle 查询 当前最大时间的value的值
    Visual Studio《加载此属性页时出错》的解决办法
    (转) 关于在IE6下 无法跳转问题
    LINQ TO XML 个人的一些心得1
    CSS实现单行、多行文本溢出显示省略号(…)
    html 图像映射(一个图像多个连接)
    JS页面跳转大全
    首行负缩进达到内容对齐的目的
    HTML图片死活不显示
    JS高级. 06 缓存、分析解决递归斐波那契数列、jQuery缓存、沙箱、函数的四种调用方式、call和apply修改函数调用方法
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/BST.html
Copyright © 2020-2023  润新知