二叉查找树的操作

概念:使二叉树变成二叉查找树的性质是,对于树中的每个结点x,它的左子树中所有关键字值小于x的关键字值,而它的右子树中所有关键字的值大于x的关键字值

先序输入

<span style="font-size:14px;">typedef struct bitnode
{
    int data;//对于数字的输入注意对于每个数字之间的空格如果是字符的话就不用空格把每个字符分开
    struct bitnode* lchild;
    struct bitnode* rchild;
}bitnode,*bitree;
void create(bitree &bt)
{
    int data;
    cin>>data;
    if(data==0)
        bt=NULL;
    else
    {
        bt=(bitree)malloc(sizeof(bitnode));
        bt->data=data;
        create(bt->lchild);
        create(bt->rchild);
    }
}</span><pre name="code" class="cpp">bitree insert(bitree p,int k)
{
    if(p==NULL)
    {
        p=(bitree)malloc(sizeof(bitnode));
        p->data=k;
        p->lchild=NULL;
        p->rchild=NULL;
    }
    else if(k<p->data)
    {
        p->lchild=insert(p->lchild,k);
    }
    else if(k>p->data)
    {
        p->rchild=insert(p->rchild,k);
    }
    return p;
}

 

关键的问题是首先要对是否为空树进行测试,否则会在null上兜圈子

<span style="font-size:14px;">bitree find(bitree bt,int k)//寻找到某一个数值
{
    if(bt==NULL)
        return NULL;
    else if(k<bt->data)
       return  find(bt->lchild,k);
    else if(k>bt->data)
        return find(bt->rchild,k);
    else
        return bt;
}</span>
查找最大最小值

以findmin的递归为例,从根开始并且只要有左儿子就向左进行,终止点是最小的元素

bitree find(bitree bt,int k)//寻找到某一个数值
{
    if(bt==NULL)
        return NULL;
    else if(k<bt->data)
       return  find(bt->lchild,k);
    else if(k>bt->data)
        return find(bt->rchild,k);
    else
        return bt;
}

findmax的非递归算法

bitree findmax(bitree bt)//非递归寻找最大值
{
    if(bt!=NULL)
    {
        while(bt->rchild!=NULL)
        {
            bt=bt->rchild;
        }
    }
    return bt;
}

插入

重复元的插入可以通过在结点纪录中保留一个附加域

bitree insert(bitree p,int k)
{
    if(p==NULL)
    {
        p=(bitree)malloc(sizeof(bitnode));
        p->data=k;
        p->lchild=NULL;
        p->rchild=NULL;
    }
    else if(k<p->data)
    {
        p->lchild=insert(p->lchild,k);
    }
    else if(k>p->data)
    {
        p->rchild=insert(p->rchild,k);
    }
    return p;
}

删除

<span style="font-size:14px;">bitree delete_(bitree &bt,int k)
{
    bitree tmpcell; //定义在外面的变量tmcepll
    if(bt==NULL)
        return bt;
    else if(k<bt->data)
       bt->lchild=delete_(bt->lchild,k);
    else if(k>bt->data)
        bt->rchild=delete_(bt->rchild,k);
    else if(bt->lchild!=NULL && bt->rchild!=NULL)
    {
        tmpcell=findmin(bt->rchild);
        bt->data=tmpcell->data;
        bt->rchild=delete_(bt->rchild,bt->data);
    }
    else
    {
        tmpcell=bt;
        if(bt->lchild==NULL)
            bt=bt->rchild;
        else if(bt->rchild==NULL)
            bt=bt->lchild;
        free(tmpcell);
    }
    return bt;//每次返回赋值给的是结点的左孩子或者是右孩子
}</span>


/*          6   如何输入带空的树,先序例子 0为空
           / \
          2  8
         /\  /\
        1  4 0 0
       /\ /
      0 0 3
         /\
        0  0
*/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值