二叉排序树的插入与删除(数据结构noj)

代码:

含注释,供参考

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int data;//数据
    struct Node*Lchild;//左子树
    struct Node*Rchild;//右子树
}*BiTree,BTNode;

void CreateBiTree(BiTree*B);//先序创建排序二叉树
void Inorder(BiTree B,int a,int b);//中序遍历二叉树,寻找a 与b 之间的数并输出
void Insert(BiTree B,int ins);//插入并中序输出二叉树
void deletedata(BiTree B,int del,int del1);//删除并中序输出二叉树(把插入的也删了)

int main()
{
    BiTree BT;
    CreateBiTree(&BT);//先序创建排序二叉树
    int low,high,ins,del;//查找的数据在 low 与 high 之间,ins: 插入值,del:删除值
    scanf("%d %d\n%d\n%d",&low,&high,&ins,&del);
    Inorder(BT,low,high);
    printf("\n");//将输出分隔开
    Insert(BT,ins);//插入并中序输出二叉树
    printf("\n");//将输出分隔开
    deletedata(BT,del,ins);//删除并中序输出二叉树(把插入的也删了)
    return 0;
}

/*先序创建排序二叉树
 */
void CreateBiTree(BiTree*B)
{
    int data;
    scanf("%d",&data);
    if(data!=-1)
    {
        *B=(BiTree)malloc(sizeof(BTNode));
        (*B)->data=data;
        CreateBiTree(&((*B)->Lchild));//递归创建左子树
        CreateBiTree(&((*B)->Rchild));//递归创建右子树
    }
    else *B=NULL;
}

/*中序遍历二叉树,寻找a 与b 之间的数并输出
 *a:下限
 *b:上限
 */
void Inorder(BiTree B,int a,int b)
{
    if(B)
    {
        Inorder(B->Lchild,a,b);//寻找右子树的数据
        int data=B->data;
        if(data>a&&data<b)
            printf("%d ",data);//输出数据
        Inorder(B->Rchild,a,b);//寻找左子树的数据
    }
}

/*插入并中序输出二叉树
 *ins:插入值
 */
void Insert(BiTree B,int ins)
{
    BiTree bt=B,pre;
    int sign;
    while(bt!=NULL)//寻找插入值
    {
        pre=bt;//pre 记录上一个节点
        if(ins<bt->data)
        {
            bt=bt->Lchild;
            sign=0;//表示是左子树
        }
        else if(ins>bt->data)
        {
            bt=bt->Rchild;
            sign=1;//表示是右子树
        }
    }
    if(sign==0)
    {
        pre->Lchild=(BiTree)malloc(sizeof(BTNode));
        pre->Lchild->data=ins;
        pre->Lchild->Lchild=NULL;
        pre->Lchild->Rchild=NULL;//完成插入
    }
    else
    {
        pre->Rchild=(BiTree)malloc(sizeof(BTNode));
        pre->Rchild->data=ins;
        pre->Rchild->Lchild=NULL;
        pre->Rchild->Rchild=NULL;//完成插入
    }
    Inorder(B,0,32867);//中序输出
}

/*删除并中序输出二叉树(把插入的也删了)
 *del,del1: 删除值
 */
void deletedata(BiTree B,int del,int del1)
{
    BiTree pre,bt;
    int D[2]= {del1,del};
    for(int i=0; i<2; i++)
    {
        del=D[i];
        pre=B,bt=B;
        while(bt->data!=del)//寻找删除位置
        {
            pre=bt;//pre 记录bt 前一个节点,便于删除调整结构
            if(del<bt->data)
                bt=bt->Lchild;
            else if(del>bt->data)
                bt=bt->Rchild;
        }
        if(pre->Lchild==bt)
        {
            pre->Lchild=bt->Rchild;
            BiTree btlchild=bt->Lchild;//记录删除节点 bt 的左子树
            bt=bt->Rchild;//bt 右子树
            if(bt!=NULL)//bt 不为空时,将btlchild 插入最左边节点下
            {
                while(bt->Lchild)
                    bt=bt->Lchild;
                bt->Lchild=btlchild;
            }
            else //bt 为空,pre 的左子树是btlchild
            {
                pre->Lchild=btlchild;
            }
        }
        else if(pre->Rchild==bt)
        {
            pre->Rchild=bt->Lchild;
            BiTree btrchild=bt->Rchild;//记录删除节点 bt 的右子树
            bt=bt->Lchild;//bt 左子树
            if(bt!=NULL)//bt 不为空时,将btrchild 插入最右边节点下
            {
                while(bt->Rchild)
                    bt=bt->Rchild;
                bt->Rchild=btrchild;
            }
            else //bt 为空,pre 的右子树是btlchild
            {
                pre->Rchild=btrchild;
            }
        }
        else  //删除根结点时,直接输出左右子树
        {
            Inorder(B->Lchild,0,32867);
            Inorder(B->Rchild,0,32867);
            return;
        }
    }
    Inorder(B,0,32867);//中序输出
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流光焰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值