数据结构学习记录-二叉搜索树

来源:互联网 发布:软件java 编辑:程序博客网 时间:2024/05/29 11:06

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

二叉搜索树:可以为空,如果不为空

①非空左子树的所有键值小于其根结点的键值

②非空右子树的所有键值大于其根结点的键值

③左右子树都是二叉搜索树

//Binary Search Tree操作的特别函数
Position Find(ElementType X,BinTree BST);
Position FindMin(BinTree BST);
Position FindMax(BinTree BST);
BinTree Insert(ElementType X,BinTree BST);
BinTree Delete(ElementType X,BinTree BST);


#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct TNode* Position;
typedef Position BinTree;   //二叉树类型
struct TNode    //树结点定义
{
    ElementType Data;   //结点数据
    BinTree Left;   //指向左子树
    BinTree Right;  //指向右子树
};


//尾递归
Position Find(ElementType X,BinTree BST)
{
    if(!BST)
        return NULL;
    if(X > BST->Data)
        return Find(X,BST->Right);  //在右子树中继续查找
    else if(X < BST->Data)
        return Find(X,BST->Left);   //在左子树中继续查找
    else //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
            return BST;
    }
    return NULL;
}

//查找最小元素的递归函数
Position FindMin(BinTree BST)
{
    if(!BST)
        return NULL;    //空的二叉树返回NULL
    else if(!BST->Left)
        return BST;     //找到最左叶结点并返回
    else
        return FindMin(BST->Left);      //沿左分支继续查找
}
//查找最大元素的迭代函数
Position FindMax(BinTree BST)
{
    if(BST)
    {
        while(BST->Right)
            BST = BST->Right;
        return BST;
    }
    else
        return NULL;
}
//二叉搜索树的插入
BinTree Insert(ElementType X,BinTree BST)
{
    if(!BST)    //若原树为空,生成并返回一个结点的二叉搜索树
    {
        BST = (BinTree)malloc(sizeof(struct TNode));
        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);
    }
    return BST;
}

//二叉搜索树的删除
/*考虑三种情况
①删除叶结点,直接删除,修改父结点指针为NULL
②删除的结点只有一个孩子结点,修改父结点的指针指向要删除结点的孩子结点
③要删除的结点有左右两棵子树,用另一结点替代被删除结点,右子树的最小元素或左子树的最大元素*/
BinTree Delete(ElementType X,BinTree BST)
{
    Position Tmp;
    if(!BST)
        printf("not find the element you want to delete\n");
    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(X,BST->Right);  //在删除结点的右子树中删除最小元素
        }
        else    //被删除结点有一个或无孩子结点
        {
            Tmp = BST;
            if(!BST->Left)  //有右孩子或无孩子结点
                BST = BST->Right;
            if(!BST->Right) //有左孩子或无孩子结点
                BST = BST->Left;
            free(Tmp);
        }
    return BST;
}











原创粉丝点击