#include <stdio.h>
#include <iostream>
using namespace std;
#define size 20
typedef int Elemtype;
/*二叉排序树的二叉链表存储结构*/
typedef struct BTNode {
Elemtype key;
struct BTNode *lchild, *rchild;
}*BSTree;
/*二叉排序树的删除*/
BSTree Delete(BSTree T, BTNode *p, BTNode *f) {
BTNode *par = NULL;
BTNode *s = NULL;
if (p->lchild == NULL&&p->rchild == NULL) {
if (f == NULL)
T = NULL;
else {
if (f->lchild == p)
f->lchild = NULL;
else
f->rchild = NULL;
}
delete(p);
}
else if (p->lchild == NULL&&p->rchild != NULL) {
if (f == NULL)
T = p->rchild;
else {
if (f->lchild == p)
f->lchild = p->rchild;
else
f->rchild = p->rchild;
}
delete(p);
}
else if (p->lchild != NULL&&p->rchild == NULL) {
if (f == NULL)
T = p->lchild;
else {
if (f->lchild == p)
f->lchild = p->lchild;
else
f->rchild = p->lchild;
}
delete(p);
}
else {
par = p;
s = p->lchild;
while (s->rchild != NULL) {
s = s->rchild;/*找到p左子树的关键字最大(最右下)的结点*/
}
p->key = s->key;
if (par == p)
par->lchild = s->lchild;/*处理特殊情况,*p的左孩子为*s*/
else
par->rchild = s->lchild;/*s的左子树连接到s的双亲结点作为双亲*/
delete(s);
}
return T;
}
/*二叉排序树的查找*/
BTNode *Search(BSTree T, int key){
if (T == NULL)
return NULL;
if (T->key == key)
return T;
if (T->key > key)
return Search(T->lchild, key);
if (T->key < key)
return Search(T->rchild, key);
}
BTNode *SearchDelete(BSTree T, int key, BSTree *F) {
/*为了删除操作而修改的二叉排序树查找*/
if (T == NULL)
return NULL;
if (key == T->key)
return T;
*F = T;
if (key < T->key)
return SearchDelete(T->lchild, key, F);
if (key > T->key)
return SearchDelete(T->rchild, key, F);
}
BSTree DeleteKey(BSTree T, int key) {
/*在二叉排序树中查找并删除关键字为key的记录*/
BTNode *F = NULL;
BTNode *P = NULL;
P=SearchDelete(T,key,&F);
if (P != NULL)
T = Delete(T, P, F);
else
printf("Keywords %d is not exist!\n", key);
return T;
}
/*二叉排序树的插入*/
BSTree InsertNode(BSTree T, BTNode *s) {
if (T == NULL)
return T = s;
if (s->key < T->key)
T->lchild = InsertNode(T->lchild, s);
if (s->key > T->key)
T->rchild = InsertNode(T->rchild, s);
return T;
}
BSTree InsertKey(BSTree T, int key) {
BTNode *s = Search(T, key);
if (s != NULL) {
printf("\n keywords %d always has exist !\n", key);
return T;
}
s = new BTNode;
s->key = key;
s->lchild = s->rchild = NULL;
T = InsertNode(T, s);
return T;
}
/*二叉排序树的创建*/
BSTree Create(BSTree T) {
BSTree s = NULL;
int key = 0;
printf("Please enter keywords,end with -1!\n");
while (1) {
scanf("%d", &key);
if (key == -1)
break;
s = new BTNode;
s->key = key;
s->lchild = s->rchild = NULL;
T = InsertNode(T, s);
}
return T;
}
void print(BSTree T) {
if (T == NULL)
return;
//中序输出二叉树
print(T->lchild);
printf("%d ", T->key);
print(T->rchild);
return;
}
int main()
{
BSTree T = NULL;
int key=0;
T=Create(T);
print(T);
printf("\n");
printf("Please enter an integer to search!\n");
scanf("%d",&key);
DeleteKey(T,key);
printf("after delete keyword %d ,LDR is ");
print(T);
printf("\n");
printf("Please enter an integer to search!\n",key);
scanf("%d",&key);
InsertKey(T,key);
printf("after insert keyword %d ,LDR is ",key);
print(T);
printf("\n");
return 0;
}
二叉排序树 插入 删除
最新推荐文章于 2022-11-16 17:11:34 发布