C语言-二叉搜索树练习

#include<stdio.h>
typedef struct TreeNode *BinTree;
struct TreeNode
{
    int Data;
    BinTree Left,Right;
};
BinTree BST_FindMin(BinTree BST);
BinTree BST_Insert(int X,BinTree BST)
{
    if(!BST)
    {
        BST=(BinTree)malloc(sizeof(struct TreeNode));
        BST->Left=BST->Right=NULL;
        BST->Data=X;
    }
    else
    {
        if(X<BST->Data)
        {
            BST->Left=BST_Insert(X,BST->Left);
        }
        if(X>BST->Data)
        {
            BST->Right=BST_Insert(X,BST->Right);
        }
    }
    return BST;
}
BinTree BST_Delete(int X,BinTree BST)
{
    BinTree Tmp;
    if(!BST)
    {
        printf("要删除的元素不存在");
    }
    else
    {
        if(X<BST->Data)
        {
            BST->Left=BST_Delete(X,BST->Left);
        }
        else if(X>BST->Data)
        {
            BST->Right=BST_Delete(X,BST->Right);
        }
        else
        {
            if(BST->Left&&BST->Right)
            {
                Tmp=BST_FindMin(BST->Right);
                BST->Data=Tmp->Data;
                BST->Right=BST_Delete(Tmp->Data,BST->Right);

            }
            else if(!BST->Left)
            {
                Tmp=BST;
                BST=BST->Right;
                free(Tmp);

            }
            else if(!BST->Right)
            {
                Tmp=BST;
                BST=BST->Left;
                free(Tmp);
            }

        }
        return BST;
    }
}
int BST_Depth(BinTree BST)
{
    if(BST)
    {
        int LeftDepth,RightDepth;
        LeftDepth=BST_Depth(BST->Left);
        RightDepth=BST_Depth(BST->Right);
        return ((LeftDepth>=RightDepth?LeftDepth:RightDepth)+1);
    }
    else return 0;
}
void BST_InTraversal(BinTree BST)
{
    if(BST)
    {
        BST_InTraversal(BST->Left);
        printf("%d ",BST->Data);
        BST_InTraversal(BST->Right);
    }
}
BinTree BST_FindX(int X,BinTree BST)
{
    if(!BST)
    {
        printf("查找的元素不存在");
        return NULL;
    }
    else
    {
        if(X<BST->Data)
            return BST_FindX(X,BST->Left);
        else if(X>BST->Data)
            return BST_FindX(X,BST->Right);
        else if(X==BST->Data)
            return BST;
    }
}
BinTree BST_FindMin(BinTree BST)
{
    BinTree Tmp=BST;
    while(!Tmp->Left)
    {
        Tmp=Tmp->Left;
    }
    return Tmp;
}
BinTree BST_FindMax(BinTree BST)
{
    BinTree Tmp=BST;
    while(!Tmp->Right)
    {
        Tmp=Tmp->Right;
    }
    return Tmp;

}
int main()
{
    BinTree BST1=NULL;
    while(1)
    {
        printf("输入需要的操作:\nA.插入元素\nB.删除元素\nC.求深度\nD.中序遍历\nE.退出\n");
        char c;
        scanf("%c",&c);

        if(c=='A')
        {
            printf("输入要插入的元素:\n");
            int a;
            scanf("%d",&a);
            BST1=BST_Insert(a,BST1);
        }
        if(c=='B')
        {
            printf("输入要删除的元素:\n");
            int a;
            scanf("%d",&a);
            BST1=BST_Delete(a,BST1);
        }
        if(c=='C')
        {
            int n=BST_Depth(BST1);
            printf("树的深度为:%d\n",n);
        }
        if(c=='D')
        {
            printf("中序遍历为:\n");
            BST_InTraversal(BST1);
            printf("\n");

        }
        if(c=='E')
            break;
        char m=getchar();
    }
    return 0;

}







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值