二叉排序树

二叉排序树

二叉排序树(Binary sort tree),又称为二叉查找树.它或者是一颗空树,或者是具有下列性质的二叉树.

  • 若它的左子树不为空,则左子树上的所有节点的值均小于它的根节点.
  • 若它的右子树不为空,则右子树上的所有节点的值均大于它的根节点.
  • 它的左右子树也分别为二叉排序树

代码

/**
2018-11-26 16:54:26
二叉排序树
**/

#include <stdio.h>

#define TRUE 1
#define FALSE 0

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

int insertBST(BiTree *T,int key);

//访问结点并输出
void visit(BiTree bt)
{
    if (bt->data != NULL)
    {
        printf("%3d", bt->data);
    }
}

//中序遍历
void InNode(BiTree bt)
{

    if (bt != NULL)
    {
        InNode(bt->lchild);
        visit(bt);
        InNode(bt->rchild);
    }
}
/**
T : 要查询的二叉排序树
key : 要查找的值
f : 指向T的双亲,初始值为NULL
p : 如果查找成功返回指向该元素的节点,否则p为指向查找路径上访问的最后一个节点.
**/
int SearchBST(BiTree T, int key,BiTree f, BiTree *p)
{
    if( !T )  //查找不成功
    {
        *p = f; //p指向访问的最后一个节点.
        return FALSE;
    }
    else if(key == T->data){
        *p = T;
        return TRUE;
    }else if(key > T->data){
        return SearchBST(T->rchild,key,T,p);
    }else
        return SearchBST(T->lchild,key,T,p);
}

//二叉排序树插入操作.
int insertBST(BiTree *T,int key)
{
    BiTree p,s;
    if( !SearchBST(*T,key,NULL,&p) ){ //查找不成功(False为 1),这个时候p指向了最后一个节点.
        s =(BiTree) malloc(sizeof(BTNode));  //说明不存在,插入一个节点.
        s->data =key;
        s->lchild=s->rchild=NULL;

        if(!p) //p为空,说明这个时候没有二叉排序树.
            *T = s;  //s为根节点
        else if (key < p->data)
            p->lchild = s;
        else
            p->rchild = s;
        return TRUE;
    }
    return FALSE;
}

int 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;  //s指向被删除节点的直接前驱
                            //s的值是被删除节点的左子树下的最大值.
        if(q!=*p)   //说明被删除节点的左子树存在右子树
            q->rchild =s->lchild;
        else
            q->lchild=s->lchild;
        free(s);
    }
    return TRUE;
}
//二叉排序树的删除
int deleteBST(BiTree *T,int key)
{
    BiTree p;
    if( !SearchBST(*T,key,NULL,&p) ){  //查找不成功,不存在关键字
        return FALSE;
    }
    else
        Delete(&p); //如果查找成功,p指向该元素节点.

}
int main()
{
    int i;
    BiTree T=NULL,p;
    int a[10]={12,23,35,48,49,55,78,85,89,93};
    for(i=0;i<10;i++)
    {
        insertBST(&T,a[i]);
    }
    InNode(T);
    printf("\n");
    insertBST(&T,51);
    InNode(T);
    printf("\n");
    deleteBST(&T,55);
    InNode(T);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值