二叉查找树的基本操作(建立,插入,删除,遍历)

#include <stdio.h>
#include <stdlib.h>
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
typedef int ElementType;
struct TreeNode
{
    ElementType Element;
    SearchTree Left;
    SearchTree Right;
};
SearchTree MakeEmpty(SearchTree T)
{
    if(T!=NULL)
    {
        MakeEmpty(T->Left);
        MakeEmpty(T->Right);
        free(T);
    }
    return T;
}
/*
*    if(X<T->Element)
        return Find(X,T->Left);
    else if(X>T->Element)
        return Find(X,T->Right);
*递归的每一层都返回值X的指针,最终函数返回的是指向值X的指针
*/
Position Find(ElementType X,SearchTree T)
{
    if(T==NULL)
        return NULL;
    if(X<T->Element)
        return Find(X,T->Left);
    else if(X>T->Element)
        return Find(X,T->Right);
    else
        return T;
}
Position FindMin(SearchTree T)
{
    if(T==NULL)
        return NULL;
    if(T->Left==NULL)
        return T;
    else
        return FindMin(T->Left);
}
Position FindMax(SearchTree T)
{
    if(T!=NULL)
    {
         while(T->Right!=NULL)
            T=T->Right;
    }
/*
*return T结束本次递归的Insert函数,由于T->Left=Insert(X,T->Left);T->Right=Insert(X,T->Right);
*有指针赋值情况,将T层层往上,递归最后一层指向了根节点,所以函数返回根节点的指针。
*/
    return T;
}
SearchTree Insert(ElementType X,SearchTree T)
{
    if(T==NULL)
    {
        T=(struct TreeNode*)malloc(sizeof(struct TreeNode));
        if(T==NULL)
            printf("Out of space!!!");
        else
        {
            T->Element=X;
            T->Left=T->Right=NULL;
        }
    }
    else if(X<T->Element)
        T->Left=Insert(X,T->Left);
    else if(X>T->Element)
        T->Right=Insert(X,T->Right);
    return T;
}
SearchTree Delete(ElementType X,SearchTree T)
{
    Position TmpCell;
    if(T==NULL)
        printf("Element Not Found");
    else if(X<T->Element)
        T->Left=Delete(X,T->Left);
    else if(X>T->Element)
        T->Right=Delete(X,T->Right);
    else if(T->Left&&T->Right)//有两个孩子
    {
        TmpCell=FindMin(T->Right);
        T->Element=TmpCell->Element;
        T->Right=Delete(T->Element,T->Right);
    }
    else//有一个或者零个孩子
    {
        TmpCell=T;
        if(T->Left==NULL)
            T=T->Right;
        else if(T->Right==NULL)
            T=T->Left;
        free(TmpCell);
    }
    return T;
}
void PrintDLR(SearchTree T)//先序遍历二叉查找树
{
    if(T!=NULL)
    {
        printf("%3d\n",T->Element);
    }
    if(T->Left!=NULL)
        PrintDLR(T->Left);
    if(T->Right!=NULL)
        PrintDLR(T->Right);
}
void PrintLDR(SearchTree T)//中序遍历二叉查找树
{
    if(T->Left!=NULL)
    {
        PrintLDR(T->Left);
    }
    printf("%3d\n",T->Element);
    if(T->Right!=NULL)
    {
        PrintLDR(T->Right);
    }
}
void PrintLRD(SearchTree T)//后序遍历二叉查找树
{
    if(T->Left!=NULL)
    {
        PrintLRD(T->Left);
    }
    if(T->Right!=NULL)
    {
        PrintLRD(T->Right);
    }
    printf("%3d\n",T->Element);
}

int main()
{
    SearchTree T;
    T=(struct TreeNode*)malloc(sizeof(struct TreeNode));
    T->Element=9;
    T->Left=T->Right=NULL;
    int arr[8]={6,2,1,8,7,10,3,18};
    int i;
    for(i=0;i<8;++i)
    {
        Insert(arr[i],T);
    }
//    printf("%3d\n",T->Element);

    printf("中序遍历:");
    PrintLDR(T);
    printf("先序遍历:");
    PrintDLR(T);
    printf("后序遍历:");
    PrintLRD(T);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值