头文件
<pre name="code" class="cpp">#include<stdio.h>
#include<stdlib.h>
typedef struct node //定义二叉树类型
{
int data;
struct node *lchild;
struct node *rchild;
}BiTreeNode, *BiTree;
//二叉树查找树的查找,如果找到关键字为x,则返回指向结点的指针,否则返回NULL;
BiTree BSTSearch(BiTree T, int x)
{
BiTree p;
if (T != NULL)
{
p = T;
while (p != NULL)
{
if (p->data == x)
{
return p;//返回其指针
}
else if (x < p->data)//如果x小于结点数,x在其p的左子树中
{
p = p->lchild;
}
else if (x>p->data)//如果x>结点元素,x在其p的右梓树中,就在柚子树中查找
{
p = p->rchild;
}
}
}
return NULL;
}
//二叉查找树的插入操作
//插入成功返回1,失败0
int BSTInsert(BiTree *T, int x)
{
BiTree p, cur, parent = NULL;
cur = *T;
while (cur != NULL)
{
if (cur->data == x)//已经存在关键字为x的结点,插入失败
{
return 0;
}
parent = cur;
if (x < cur->data)
{
cur = cur->lchild;
}
else
{
cur = cur->rchild;
}
}
p = (BiTreeNode*)malloc(sizeof(BiTreeNode));
if (!p)
exit(-1);
p->data = x;
p->lchild = NULL;
p->rchild = NULL;
if (!parent)
{
*T = p;
}
else if (x < parent->data)//如果关键字小于他的parent指向的结点则将新节点成为parent的左孩子
parent->lchild = p;
else //如果关键字大于parent<<<<<<<<<与上面相同
parent->rchild = p;
return 1;
}
//从二叉查找树种删除结点s,并使该二叉查找树性质不变
void DeleteNode(BiTree *s)
{
BiTree q, x, y;
if (!(*s)->rchild)//如果该结点没有柚子树则 s的左子树成为被删除结点的双亲结点的左子树
{
q = *s;
*s = (*s)->lchild;
free(q);
}
else if (!(*s)->lchild)
{
q = *s;
*s = (*s)->rchild;
free(q);
}
else //如果s的左右子树都存在,则使s的直接前驱结点代替s,并是直接前驱结点的左子树成为成为其双亲结点的柚子树
{
x = *s;
y = (*s)->lchild;
while (y->rchild )//查找s的直接前驱结点,y为s的直接前驱结点.x为y的双亲结点
{
x = y;
y = x->rchild;
}
(*s)->data = y->data;//结点s被y取代
if (x != *s)//如果结点s的左孩子结点不存在右梓树的话,
{
x -> rchild = y->lchild;//使y的左子树成为x其柚子树
}
else
{
x->lchild = y->lchild;
}
free(y);
}
}
//在二叉查找树种找到关键字为x的结点,并进行删除之,删除成功返回1,否则返回0
int BSTDelete(BiTree *T, int x)
{
if (!*T)
return 0;
else
{
if (x == (*T)->data)//找到其x就删除
{
DeleteNode(T);
}
else if ((*T)->data > x)
{
BSTDelete(&((*T)->lchild), x);
}
else
BSTDelete(&((*T)->rchild), x);
return 1;
}
}
void zhongxu(BiTree T)
{
if (T)
{
zhongxu(T->lchild);
printf("%4d", T->data);
zhongxu(T->rchild);
}
}
主函数
#include"BiTree1.h"
int main()
{
BiTree T = NULL;
BiTree p;
int table[] = { 37, 32, 35, 62, 82, 95, 73, 12, 5, 99 };
int n = sizeof(table) / sizeof(int);
int x = 74, s = 12;
for (int i = 0; i < n; i++)
{
int j=BSTInsert(&T, table[i]);
//printf("%d\n", j);
}
printf("中序遍历二叉查找树得到的序列\n");
zhongxu(T);
p = BSTSearch(T, x);
if (p != NULL)
printf("\n二叉查找树关键字%d存在\n",x);
else
printf("查找失败!\n");
BSTDelete(&T, s);//删除关键字
printf("删除元素%d后,中序遍历二叉查找树得到的序列\n", s);
zhongxu(T);
system("pause");
return 0;
}