#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
//二叉排序树
typedef struct BiNode
{
int data;
struct BiNode *leftchild,*rightchild;
}BiNode,*BiNodePtr,*BiTree;
//初始化二叉排序树
BiNodePtr InitTree(BiTree T)
{
int e;
scanf("%d",&e);
if(e!=-1)
{
T=(BiNodePtr)malloc(sizeof(BiNode));
T->data=e;
T->leftchild=InitTree(T->leftchild);
T->rightchild=InitTree(T->rightchild);
}
else
{
T=NULL;
}
return T;
}
//二叉排序树插入
BiTree insertBST(BiTree bt,int val)//bt应该为引用,因为层层改变
{
if(bt==NULL)
{
BiNodePtr S;
S=(BiNodePtr)malloc(sizeof(BiNode));
S->data=val;
S->leftchild=NULL;
S->rightchild=NULL;
bt=S;
}
else
{
if(val<bt->data) bt->leftchild=insertBST(bt->leftchild,val);
else bt->rightchild=insertBST(bt->rightchild,val);
}
return bt;
}
//二叉树的中序遍历
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return ;
InOrderTraverse(T->leftchild);
printf("%d ",T->data);
InOrderTraverse(T->rightchild);
}
//输出特定区间
void PrintBTs(BiTree T,int min,int max)
{
if(T==NULL)
return ;
PrintBTs(T->leftchild,min,max);
if(T->data>min && T->data<max)printf("%d ",T->data);
PrintBTs(T->rightchild,min,max);
}
//删除二叉树
void DeleteBTS(BiTree T,int val)
{
if(T==NULL)
return ;
BiTree f,p;
p=T;
f=NULL;
while(p)
{
if(p->data==val)//找到跳出
break;
else
{
f=p;//f为p的双亲
if(p->data>val) p=p->leftchild;//去左子树找小的
else p=p->rightchild;//去右子树找大的
}
}
BiNodePtr q,s;
//第一种情况,被删除的结点左右子树都存在,可以去左子树找最大,也可以去右子树找最小
if((p->leftchild)&&(p->rightchild))//都不空
{
q=p;
s=p->leftchild;
while(s->rightchild)
{
q=s;
s=s->rightchild;
}
p->data = s->data;
if(q!=p)//重新连接q的左子树
{
q->rightchild=s->leftchild;
}
else
{
q->leftchild=s->leftchild;
}
free(s);
return;
}
//p的右子树空,或都空
else if(p->rightchild==NULL)
{
if(f)//判断被删结点是否为根结点,若是,则f=null;
{
if(f->leftchild==p)//被删结点的双亲结点的左孩子为p
{
f->leftchild=p->leftchild;
p->leftchild=NULL;
}
else//被删结点的双亲结点的右孩子为p
{
f->rightchild=p->leftchild;
p->leftchild=NULL;
}
free(p);
return;
}
else//被删结点为根节点
{
f=p;
p=p->leftchild;
f->leftchild=NULL;
free(f);
T=p;
return;
}
}
//p的左子树空,或者都空
else
{
if(f)//不是根节点
{
if(f->leftchild==p)//被删的p为左孩子
{
f->leftchild=p->rightchild;
p->rightchild=NULL;
}
else//被删的p为有孩子
{
f->rightchild=p->rightchild;
p->rightchild=NULL;
}
free(p);
}
else//被删的p为根节点
{
f=p;
p=p->rightchild;
f->leftchild=NULL;
free(f);
T=p;
return;
}
}
}
int main()
{
BiTree T;
T=InitTree(T);
int min,max;
scanf("%d %d",&min,&max);
int insert;
scanf("%d",&insert);
int del;
scanf("%d",&del);
PrintBTs(T,min,max);
printf("\n");
insertBST(T,insert);
InOrderTraverse(T);
DeleteBTS(T,insert);
printf("\n");
DeleteBTS(T,del);
InOrderTraverse(T);
printf("\n");
return 0;
}