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

来源:互联网 发布:软件脱壳 编辑:程序博客网 时间:2024/04/30 10:03

二叉查找树

    二叉查找树(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;}//=========================================================


0 0
原创粉丝点击