//二叉排序树的插入和删除(关键递归很重要)
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct TNode
{
int elem;
struct TNode *lchild,*rchild;
}TNode,*TNodePtr,*TreePtr;
TNodePtr Init_Tree(TreePtr T){
int e;
scanf("%d",&e);
if(e != -1)
{
T = (TNodePtr)malloc(sizeof(TNode));
T->elem = e;
T->lchild = Init_Tree(T->lchild);
T->rchild = Init_Tree(T->rchild);
}
else
{
T = NULL;
}
return T;
}
void Show(TreePtr T,int a,int b){//输出大于a小于b的关键字
if(T == NULL)
return;
if(T->elem > a && T->elem <b)
{
Show(T->lchild,a,b);
printf("%d ",T->elem);
Show(T->rchild,a,b);
}
else if(T->elem >= b)
{
Show(T->lchild,a,b);
}
else if(T->elem <= a)
{
Show(T->rchild,a,b);
}
}
TreePtr Insert_BST(TreePtr T,int N){//插入
if(T == NULL)
{
TNodePtr S;
S = (TNodePtr)malloc(sizeof(TNode));
S->elem = N;
S->lchild = NULL;
S->rchild = NULL;
T = S;
}
else if(N < T->elem){
T->lchild = Insert_BST(T->lchild,N);
}
else if(N > T->elem){
T->rchild = Insert_BST(T->rchild,N);
}
return T;
}
void Delete_BST(TreePtr T,int D){//删除
TNodePtr p,f,s,q;
p = T;f = NULL;
while(p){ //查找关键字为D的节点
if(p->elem == D)
break;
f = p; // 保留双亲节点
if(p->elem > D) p = p->lchild;
else p = p->rchild;
}
if(p == NULL) return;//结束
if(p->lchild == NULL) //没有左子树
{
if(f == NULL) //p是根节点
T = T->rchild;
else if(f->lchild == p) // p是左孩子节点
f->lchild = p->rchild;
else //右孩子节点
f->rchild = p->rchild;
free(p);
}
else //有左子树
{
q = p;s = p->lchild;
while(s->rchild)
{q = s;s = s->rchild;}
if(q == p) q->lchild = s->lchild;
else q->rchild = s->lchild;
p->elem = s->elem;
free(s);
}
}
void Print_BST(TreePtr T){
if(T == NULL)
return;
else
{
Print_BST(T->lchild);
printf("%d ",T->elem);
Print_BST(T->rchild);
}
}
int main(){
TreePtr t;
t = Init_Tree(t);
int a,b,x,d;
scanf("%d %d",&a,&b);
scanf("%d",&x);
scanf("%d",&d);
Show(t,a,b);
printf("\n");
t = Insert_BST(t,x);
Print_BST(t);
printf("\n");
Delete_BST(t,x);
Delete_BST(t,d);
Print_BST(t);
return 0;
}
noj25、二叉排序树的插入和删除
最新推荐文章于 2022-05-28 16:42:03 发布