二叉搜索树(BST,基本操作实现)

二叉搜索树(Binary Search Tree)也叫做二叉排序树或者二叉查找树。

相比正常的二叉树就是多了一条性质:左子树的键值小于其根节点的键值,右子树反之,左右子树都是二叉搜索树。


主要操作函数:(还是递归递归递归!!!)
Position Find( ElementType X, BinTree BST ):从二叉搜索树BST 中查找元素X,返回其所在结点的地址;

Position FindMin( BinTree BST ):从二叉搜索树BST中查找并返回 最小元素所在结点的地址;

Position FindMax( BinTree BST ) :从二叉搜索树BST中查找并返回 最大元素所在结点的地址。

BinTree Insert( ElementType X, BinTree BST ) :插入节点。

BinTree Delete( ElementType X, BinTree BST ):删除节点。


#include<stdio.h>
#include<stdlib.h>

#define ElementType int

typedef struct BiNode
{
    ElementType Data;
    struct BiNode* Left;
    struct BiNode* Right;
} BiNode, *BinTree,*Position;

Position Find( ElementType X, BinTree BST )   //尾递归
{
    if( !BST ) return NULL; /*查找失败*/
    if( X > BST->Data ) return Find( X, BST->Right ); /*在右子树中继续查找*/
    if( X < BST->Data ) return Find( X, BST->Left ); /*在左子树中继续查找*/
    /* X == BST->Data */
    return BST; /*查找成功,返回结点的找到结点的地址*/
}

Position IterFind( ElementType X, BinTree BST )  //迭代
{
    while( BST )
    {
        if( X > BST->Data ) BST = BST->Right; /*向右子树中移动,继续查找*/
        else if( X < BST->Data ) BST = BST->Left; /*向左子树中移动,继续查找*/
        else /* X == BST->Data */ return BST; /*查找成功,返回结点的找到结点的地址*/
    }
    return NULL; /*查找失败*/
}


Position FindMin( BinTree BST )//一直往最左递归找就是了
{

    if( !BST ) return NULL; /*空的二叉搜索树,返回NULL*/
    if( !BST->Left ) return BST; /*找到最左叶结点并返回*/
    return FindMin( BST->Left ); /*沿左分支继续查找*/
}

Position FindMax( BinTree BST )//一直往右找
{
    if(BST )
        while( BST->Right ) BST = BST->Right; /*沿右分支继续查找,直到最右叶结点*/
    return BST;
}


BinTree Insert( ElementType X, BinTree BST )//类似于find
{
    if( !BST )  /*若原树为空(或递到最后),生成并返回一个结点的二叉搜索树*/
    {
        BST = (Bintree)malloc(sizeof(struct TreeNode));
        BST->Data = X;
        BST->Left = BST->Right = NULL;
    }
    else /*开始找要插入元素的位置*/
        if( X < BST->Data ) BST->Left = Insert( X, BST->Left);  /*递归插入左子树*/
        else if( X > BST->Data ) BST->Right = Insert( X, BST->Right); /*递归插入右子树*/
    /* else X已经存在,什么都不做 */
    return BST;
}


BinTree Delete( ElementType X, BinTree BST )
{
    Position Tmp;
    if( !BST ) printf("要删除的元素未找到");
    else if( X < BST->Data ) BST->Left = Delete( X, BST->Left); /* 左子树递归删除 */
    else if( X > BST->Data ) BST->Right = Delete( X, BST->Right); /* 右子树递归删除 */
    else /*找到要删除的结点 */
        if( BST->Left && BST->Right )
        {
            /*被删除结点有左右两个子结点 */
            Tmp = FindMin( BST->Right ); /*在右子树中找最小的元素填充删除结点*/
            BST->Data = Tmp->Data;
            BST->Right = Delete( BST->Data, BST->Right); /*在删除结点的右子树中删除最小元素*/
        }
        else
        {
            /*被删除结点有一个或无子结点*/
            Tmp = BST;
            if( !BST->Left ) /* 有右孩子或无子结点*/
                BST = BST->Right;
            else if( !BST->Right ) /*有左孩子或无子结点*/
                BST = BST->Left;
            free( Tmp );
        }
    return BST;
}

//判断是否为二叉搜索树,传入MIN MAX为足够小足够大的数即可。
//还可以根据中序遍历是否递增来判断是否为二叉搜索树。在中序遍历递归基础上可以轻松完成!
bool IsBST(BinTree root,int MIN,int MAX)
{

    if(!root)return true;
    if(root->Data<=MIN||root->Data>=MAX) return false;
    return IsBST(root->Left,MIN,root->Data)&&IsBST(root->Right,root->Data,MAX);
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值