二叉排序树的基本操作(完整代码)

以下是二叉排序树的基本操作,函数基本与《大话数据结构》里的代码类似,包括查找、插入、删除操作。完整代码,可直接运行。

//二叉排序树
//其中有插入、删除、查找操作
#include
#include

#define FALSE 0
#define TURE 1
#define MAXSIZE 10

typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

//查找
//f指向T的双亲,初始时为NULL
//这里用f,*p,是问了存储查找时遍历的最后一个元素,在插入时用
int SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
    if(!T)
    {
        *p=f;
        return FALSE; 
    }
    else if(key==T->data)
    {
        *p=T;
        return TURE;
    }
    else if(keydata)
        return SearchBST(T->lchild,key,T,p);
    else
        return SearchBST(T->rchild,key,T,p);
}

//插入
//如果插不到元素,获取查找时遍历的最后一个元素
//与其比较,大则是其右子树,反之、、
void InsertBST(BiTree *T,int key)
{
    BiTree p,s;
    if(!SearchBST(*T,key,NULL,&p))      //若树中没有相同元素,继续
    {
        s=(BiTree)malloc(sizeof(BiTNode));
        s->data=key;
        s->lchild=s->rchild=NULL;       //设置新元素s
        if(!p)      //若树为空,将s设为根节点
            *T=s;
        else if(keydata)        //否则。。
            p->lchild=s;
        else
            p->rchild=s;
    }
    else
        printf("抱歉,树中已有该元素。 \n");
}

//DeleteBST用到的子函数
//删除节点无左子树,则将其右子树补到现在位置,反之亦然
//若左右字树都有,则找其左子树,然后右到底,即中序遍历时,删除节点的上一个元素——前驱
//以前驱作为新节点
void Delete(BiTree *p)
{
    BiTree q,s;
    if((*p)->rchild==NULL)      //无右,以左子树替换
    {
        q=*p;
        *p=(*p)->lchild;
        free(q);
    }
    else if((*p)->lchild==NULL)     //无左    
    {
        q=*p;
        *p=(*p)->rchild;
        free(q);
    }
    else
    {
        q=*p;
        s=(*p)->lchild;     //左一下
        while(s->rchild)    //右到底
        {
            q=s;
            s=s->rchild;
        }
        (*p)->data=s->data;     //前驱替换删除节点
        if(q!=*p)
            q->rchild=s->lchild;
        else
            q->lchild=s->lchild;
        free(s);
    }
}

//删除
void DeleteBST(BiTree *T,int key)
{
    BiTree p;
    if(SearchBST(*T,key,NULL,&p))       //找与key相等的元素
    {
        if(key==(*T)->data)
            Delete(T);
        else if(key<(*T)->data)
            DeleteBST(&(*T)->lchild,key);
        else
            DeleteBST(&(*T)->rchild,key);
    }
    else
        printf("抱歉,当前二叉树中没有你要删除的元素。 \n");
}

//中序输出
void InOrder(BiTree T)
{
    if(T)
    {
        InOrder(T->lchild);
        printf("%d ",T->data);
        InOrder(T->rchild);
    }
    else
        return;
}

void main()
{
    int i,num;
    BiTree T=NULL;

    int a[10]={66,88,58,47,35,73,51,99,37,93};
    for(i=0;i<10;i++)
    {
        InsertBST(&T,a[i]);
    }
    printf("当前的二叉树为:");
    InOrder(T);
    printf("\n");

    printf("请输入你要插入的元素:");
    scanf("%d",&num);
    InsertBST(&T,num);
    printf("当前的二叉树为:");
    InOrder(T);
    printf("\n");


    printf("请输入你要删除的元素:");
    scanf("%d",&num);
    DeleteBST(&T,num);
    printf("当前的二叉树为:");
    InOrder(T);
    printf("\n");
}

以上是最基本的代码,是看《大话数据结构》时根据书上代码编写的,适合最最基础的人看,有问题可以评论,同是菜鸟,我们一起讨论嘛~

你可能感兴趣的:(数据结构-C)