二叉搜索树的基本操作(查找、插入、删除)【数据结构】

二叉查找树

    二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树:

    (1)、若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;

    (2)、若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;

    (3)、它的左、右子树也分别为二叉查找树。

基本操作:

//============================================
//二叉搜索树的递归查找函数
Position Find(BinTree BST, int X){
    if(!BST)
        return NULL;
    else{
        if(X > BST->Data)
            return Find(BST->Right, X);
        else if(X < BST->Data)
            return Find(BST->Left, X);
        else
            return BST;
    }
}
//---------------------------------------------

//二叉搜索树的迭代查找函数
Position IterFind(BinTree BST, int X){
    while(!BST){
        if(X < BST->Data)
            BST = BST->Left;
        else if(X > BST->Data)
            BST = BST->Right;
        else
            return BST->Data;
    }
    return NULL;
}
//=============================================

//二叉搜索树:查找最小元素的递归函数
Position FindMin(BinTree BST){
    if(!BST)
        return NULL;
    else{
        if(!BST->Left)
            return BST;
        else
            return FindMin(BST->Left);
    }
}
//----------------------------------------------

//二叉搜索树:查找最小元素的迭代函数
Position IterFindMin(BinTree BST){
    if(!BST)
        return NULL;
    else{
        while(BST->Left)
            BST = BST->Left;
        return BST;
    }
}
//-----------------------------------------------

//二叉搜索树:查找最大元素的递归函数
Position FindMax(BinTree BST){
    if(!BST)
        return NULL;
    else{
        if(!BST->Right)
            return BST;
        else
            return FindMax(BST->Right);
    }
}
//------------------------------------------------

//二叉搜索树:查找最大元素的迭代函数
Position IterFindMax(BinTree BST){
    if(!BST)
        return NULL;
    else{
        while(BST->Right)
            BST = BST->Right;
        return BST;
    }
}
//=================================================

//二叉搜索树的插入
BinTree Insert(BinTree BST, int X){
    if(!BST){   //若为空,直接赋值一个新结点
        BST = (BinTree)malloc(sizeof(BinTree));
        BST->Data = X;
        BST->Left = BST->Right = NULL;
    }
    else{   //
        if(X > BST->Data)
            BST->Right = Insert(BST->Right, X);
        else if(X < BST->Data)
            BST->Left = Insert(BST->Left, X);
    }
    return BST;
}
//==================================================

//二叉搜索树的删除
BinTree Delete(BinTree BST, int X){
    if(!BST)
        printf("ERROR!");
    else if(X < BST->Data)
        BST->Left = Delete(BST->Left, X);//左子树递归删除
    else if(X > BST->Data)
        BST->Right = Delete(BST->Right, X);//右子树递归删除
    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被赋值为NULL
                BST = BST->Left;
            free(Tmp);
        }
    }
    return BST;
}
//=========================================================
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/u010552731/article/details/47377297
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞