// 二叉排序树.cpp :定义控制台应用程序的入口点。
#include "stdafx.h"
typedef int datatype;
const int arr_len = 9;//假设数组长度为9
struct node
{
datatypedata;
node*lchild,*rchild;
};
int Insert(node *&p,datatype data)
{
if(p ==NULL)
{
p = new node;
p->lchild = p->rchild = NULL;
p->data = data;
return 1;
}
else if (data== p->data)//树中不允许存在值相同的点
{
return 0;
}
else if(data< p->data)//如果值小于该节点,插入到该节点的左子树中
{
return Insert(p->lchild,data);
}
else//如果值大于该节点,插入到该节点的右子树中
{
Insert(p->rchild,data);
}
}
void input(datatype a[],int len)//输入数据
{
cout<<"请输入"<<len<<"个数据"<<endl;
for (int i =0; i < arr_len; i++)
{
cin>>a[i];
}
}
//二叉树的生成:从一个空树开始,没插入一个关键字
//就调用一次插入算法将它插入到当前已生成的二叉排序树中
node *CreateTree(datatype a[],int n)
{
node *t =NULL;
int i =0;
while (i <n)
{
Insert(t,a[i]);
i++;
}
returnt;
}
void display(node *t)//先序输出二叉树
{
if(t ==NULL)
{
return;
}
else
{
cout<<t->data;
display(t->lchild);
display(t->rchild);
}
}
node *DeleteKey(node *t,int key)//删除结点
{
node *f =NULL;
node*p;
p =t;
//先找到要删除的点
while ( p !=NULL)
{
if(p->data == key)break;
f = p;//用来保存待删除点的双亲结点
if(p->data < key) p = p->rchild;
else
{
p = p->lchild;
}
}
if(p ==NULL)
{
cout<<"没有找到删除点"<<endl;
return NULL;
}
if(p->lchild == NULL && p->rchild ==NULL)//如果待删除点是叶子结点
{
if (f != NULL)//如果待删除点不是根节点
{
if(f->lchild == t)f->lchild = NULL;//如果叶子结点是双亲结点的左孩子
elsef->rchild = NULL;//如果叶子结点是双亲结点的右孩子
}
delete(p);
cout<<"该点已经成功删除"<<endl;
}
if(p->lchild == NULL)//如果待删点的左子树为空
{
if(f == NULL)//如果待删点左子树为空,并且待删点是根节点
{
t = p->lchild;
}
else if (f->lchild == p)//如果待删点左子树为空,并且待删点不是根节点,他是作为一棵树的左子树
{
f->lchild = p->lchild;
}
else//如果待删点左子树为空,并且待删点不是根节点,它是一棵树的右子树
{
f->rchild = p->rchild;
}
delete(p);
}
else//待删点存在左子树
{
node *q=p;
node *s=p->lchild;
while(s->rchild)//找到待删点所在的左子树的最大点s
{
q=s;//q作为待删点的双亲结点
s=s->rchild;
}
if(p == q) q->lchild=s->lchild;//如果待删点的右子树为空
else//如果待删点的右子树不为空
q->rchild=s->lchild;//将最大值的点的左子树作为最大值点的双亲结点的右孩子
p->data=s->data;//修改待删点的值
free(s);//删除最大值的那个点
}
returnt;
}
node *findNode(node *t,datatype data)
{
if(t == NULL|| t->data == data)
{
return t;
}
if(data <t->data)
{
return findNode(t->lchild,data);
}
else
{
return findNode(t->rchild,data);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
datatypea[arr_len];
input(a,arr_len);
node *t =CreateTree(a,arr_len);
cout<<"前序遍历为:"<<endl;
display(t);
node *fn =findNode(t,3);
if(fn !=NULL)cout<<endl<<"查找成功!"<<endl;
else
cout<<"查找失败"<<endl;
intn;
cout<<"请输入你想删除的结点"<<endl;
cin>>n;
DeleteKey(t,n);
cout<<"删除结点后的前序遍历为:"<<endl;
display(t);
return0;
}