#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
#define ERROR 0
#define OK 1
typedef int status;
typedef int Elemtype;
typedef struct BiTNode {
ElemType data;
struct node*lchild, *rchild;
}BiTNode, *BiTree;
void InitTree(BiTree &bt, int n)
{//建立二叉排序树
int data, i;
scanf("%d", &data);
bt = (BiTree)malloc(sizeof(BiNode));
bt->data = data;
bt->lchild = bt->rchild = NULL;
for (i = 1;i < n;i++)
{
scanf("%d", &data);
Insert(bt, data);
}
}
BiTree SearchBST(BiTree T, Elemtype key) {
//在T指向根的二叉排序树递归的查找关键字等于key的元素
//若找到返回该结点的指针否则返回null
if (T == NULL) return NULL;
else if (T->data == key)return T;
else if(T->data > key)
return SearchBST(T->lchild, key);
else return SearchBST(T->rchild, key);
}
status InsertBST(BiTree &T, Elemtype e) {
//当二叉排序树不存在关键字等于e的数据元素时,插入元素e并返回true否则返回false
BiTree p = T, father = NULL;
while (p&&p->data != e) {
father = p;
if (e > p->data)
p = p->rchild;
else
p = p->lchild;
}
if (p) return FALSE;
s = (BiTree)malloc(sizeof(BiTNode));//为新结点分配空间
s->data = e;
s->lchild = s->rchild = NULL;
if (!father) T = s;
else if (e > father->data) father->rchild = s;
else father->lchild = s;
//二叉排序树的插入只在叶子节点进行
}
status DeleteBST(BiTree &T, Elemtype e) {
//若二叉排序树中存在关键字等于e的元素,删除该数据元素结点并返回true否则返回false
BiTree q, s;
if (!T->lchild && !T->rchild)
p = NULL;
else if (!T->lchild) {
q = T;
T = T->rchild;
free(T);
}
else if (!T->rchild) {
q = T;
T = T->lchild;
free(T);
}
else {
q = T;
s = T->lchild;
while (s->rchild) {
q = s;
s = s->rchild;
}
T->data = s->data;
if (q != T) /* 判断是否执行上述while循环 */
q->rchild = s->lchild; /* 执行上述while循环,重接右子树 */
else
q->lchild = s->lchild; /* 未执行上述while循环,重接左子树 */
free(s);}
//n--;
return 1;
}
void InOrder(BiTree bt)
{//树的中序遍历
if (!bt)
return;InOrder(bt->lchild);
printf("%d ", bt->data);
InOrder(bt->rchild);
}
int main(){
BiTree bt;
int n, k;
printf("输入数字的个数:");
scanf("%d", &n);
printf("请输入每个数字:");
InitTree(bt, n);
printf("中序遍历结果为:");
InOrder(bt);
putchar('\n');
printf("请输入查找的关键字:");
scanf("%d", &key);
Search(bt, key);
printf("请输入删除的关键字:");
scanf("%d", &key);
Delete_BiTree(bt, key);
printf("请输入要插入的数据:");
scanf("%d", &key);
Insert(bt, key);
printf("插入成功.\n");
printf("中序遍历结果为:");
InOrder(bt);
putchar('\n');
}
二叉排序树
最新推荐文章于 2021-02-02 17:30:02 发布