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


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

    二叉搜索树(BST,Binary Search Tree)
    又称二叉排序树或二叉查找树。

    二叉搜索树 是一棵二叉树,它可以为空。

    特性(保证键值都不相同):
    ①:非空左子树的所有键值都小于根节点的键值;
    ②:非空右子树的所有键值都大于根节点的键值;
    ③:左右子树都是BST;

    二叉树的遍历方式中序,后序,前序不说了。。

    直接说与BST操作相关的操作吧。。。。。。(自以为是由易到难的顺序讲的)

    定义

    先小小地定义一下~

    typedef int ElementType;        
    //ElementType 就是 int 的意思(要问我啥意思呢。。。就是你看ElementType这个词的意思:元素类型(是吧,我就看得懂type,前面瞎说是类型的意思,嘿嘿,平常用typedef就是为了偷懒。。)
    typedef struct TNode *Position; 
    //这些小东西不多讲了= =、指针不会就先去学指针,话说弱弱有一个很不错的指针讲义。需要的可以联系。。
    typedef Position BinTree;
    
    struct TNode{
        ElementType Data;
        BinTree Left;
        BinTree Right;
    };

    插入

    感觉插入就比较好理解???(三个反问号强行理解)
    前面已经说过左右结点键值和根结点键值的关系,
    通俗地讲每次插入的时候比根的值小就放到左边(左儿子)去,比他大放到右边(右儿子)去;

    细节方面还要考虑 这个BST是不是空的啊,还有以这个X值在这棵BST里面有没有啊;

    思路就是比这个结点小看左边,比这个结点大看右边。如果传下来是空的就插。如果有这个值= =啥也不做;
    代码来自数据结构陈越姥姥版,主要是单写这个函数的不敢自己瞎写误导读者。。。

    BinTree Insert(BinTree BST,ElementType X)
    {
        if(BST==NULL)   //如果是空,生成并返回一个结点的二叉搜索树;
        {
            BST=(BinTree)malloc(sizeof(struct TNode));
            BST->Data=X;
            BST->Left=BST->Right=NULL;
        }
        else
        {
            if(X<BST->Data)             //比这个结点小看左边
                BST->Left=Insert(BST->Left,X);
            else if(X>BST->Data)
                BST->Right=Insert(BST->Right,X);   //比这个结点大看右边
        }
        //额。。这个理解嘛。①:如果这棵BST就是空的,那么你看直接创建,插然后返回,就是根节点对吧(这棵BST就一个结点;②:如果不是空的,那么就一直下去啊下去啊下去啊,搜到可以插的位置,插,返回的是插入结点。但是你可以看到中间的函数并没有接什么值,最后还是返回了根结点
        return BST;
    }

    查找

    插入也是蛮好理解,还是利用特性嘛。
    对于给定的元素,就去找就好啦。还是和根结点比较一下,比他小就看左边,比他大就看右边,找到就返回呗。
    细节就是本身就是一棵空树,那就直接返回空就好啦;
    找到直接返回指针就好了;

    Position Find(BinTree BST , ElementType X)
    {
        if(BST==NULL) return NULL;   //如果是空,哈哈,直接返回NULL;
        if(X>BST->Data)               //如果比根的大看右边;
            return Find(BST->Right,X);
        else if(X<BST->Data)           //如果比根的小看左边;
            return Find(BST->Left,X);
        else                        //这里就是找到啊,直接返回;
            return BST;
    }
    

    查找最大最小元素

    这里还有两个操作查找最小最大元素。
    按照BST的特性我们就会知道,小的一直往左边偏,大的一直往右边偏。所以最小的就是最左边那个啊,最大就是最右边那个啊

    查找最小:
    Position FindMin(BinTree BST)
    {
        if(BST==NULL) return NULL;  //如果是空的话,返回空啊;
        if(BST->Left==NULL)         //这就说明他是最左边的那个啊
            return BST;
        else
            return FindMin(BST->Left);  //左边还有就往左边去
    }
    
    查找最大:
    Position FindMax(BinTree BST)
    {
        if(BST==NULL) return NULL;
        if(BST->Right==NULL)
            return BST;
        else
            return FindMax(BST->Right);
    }

    二叉搜索树的删除

    1.如果待删除的结点没有孩子结点,那么直接删除就好了;
    2.如果待删除的结点只有一个孩子结点,那么让孩子结点顶替他的位置;
    3.如果待删除的结点有两个孩子结点,一种方法是拿左子树的最大元素来顶替他的位置,另一种方法是拿右子树的最小元素来顶替他的位置;
    = =自己画画应该就懂了吧;

    BinTree Delete(BinTree BST,ElementType X)
    {
        Position tmp;
        if(BST==NULL)
        {
            printf("Not Found
    ");
            return BST;
        }
        if(X>BST->Data)     //右子树递归删除
            BST->Right=Delete(BST->Right,X);
        else if(X<BST->Data)        //左子树递归删除
            BST->Left=Delete(BST->Left,X);
        else    //找到
        {
            if(BST->Left&&BST->Right)       //如果左右子树都存在
            {
                tmp=FindMin(BST->Right);    //在右子树找最小的元素顶替
                BST->Data=tmp->Data;
    
                BST->Right=Delete(BST->Right,BST->Data);        //然后删除那个顶替元素(右子树的最小)
            }
            else    //待删除的结点没有子结点或只有一个
            {
                tmp=BST;
                if(BST->Left==NULL) //有右子结点,拿右顶替
                    BST=BST->Right;
                else if(BST->Right==NULL)   //有左子结点,那左顶替
                    BST=BST->Left;
                free(tmp);
            }
        }
        return BST; //最后返回,传下来的BST,因为一直都是递归啊~
    }
  • 相关阅读:
    使用Nginx搭建http服务器
    (七)Docker搭建httpd集群
    zlib库对文件进行压缩和解压操作
    (一)Apache Thrift 的使用
    (一)select、poll、epoll
    (十三)备忘录模式
    (十二)命令模式
    (十一)迭代器模式
    centos下利用httpd搭建http服务器方法
    shell快捷键
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777544.html
Copyright © 2020-2023  润新知