含注释,供参考
#include
#include
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&&dataRchild,a,b);//寻找左子树的数据
}
}
/*插入并中序输出二叉树
*ins:插入值
*/
void Insert(BiTree B,int ins)
{
BiTree bt=B,pre;
int sign;
while(bt!=NULL)//寻找插入值
{
pre=bt;//pre 记录上一个节点
if(insdata)
{
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(deldata)
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);//中序输出
}