以下内容是以C++作为编程语言以二叉链表作为存储结构的二叉排序树生成、中序遍历和节点的删除。
#include<iostream>
#include<conio.h>
using namespace std;
bool rut=false;
class jie{
public:
int data;
jie *left;
jie *right;
};
void insert1(jie **root,jie *s)//插入
{
if(*root==NULL){ *root=s;}
else if((*root)->data>s->data)insert1(&(*root)->left,s);
else insert1(&(*root)->right,s);
}
(二叉排序树的生成是一边比较一边进行插入的)
void create(jie **root,int n,int a[])//以数组A构造二叉树(root为根)
{
jie *s;
for(int i=1;i<=10;i++)
{
s=new jie;
s->data=a[i];
s->left=NULL;s->right=NULL;
insert1(&(*root),s);
//*root=s;
}
//cout<<"check successfully\n";
}
void check(jie *root,int key)//检查某节点是否存在在以root为根的树里
{
if(root->data==key)rut=true;
else if(root==NULL) rut=false;
else if(root->data>key&&root->left!=NULL)check(root->left,key);
else if(root->data<key&&root->right!=NULL)check(root->right,key);
}
void ergotic(jie *root)//中序遍历
{
jie *p=root;
if (p!=NULL)
{
ergotic(p->left);
cout<<p->data<<"\t";
ergotic(p->right);
}
}
jie *fin(jie *root)//找以root为根的最左的不为空的节点的父节点
{
jie *q=root;
jie *p=q;
while(q->left!=NULL){p=q;q=q->left;}
return p;
}
void del(jie *root,int key)//删除节点
{
jie *q=root;jie *f=q;
while(q->data!=key&& q!=NULL)
{
if(q->data>key){f=q;q=q->left;}
else{f=q; q=q->right;}
}
if(q!=NULL&&f->left==q)//q是其父节点f的左孩子时
{
jie *find,*p=NULL;
if(q->left==NULL&&q->right==NULL)f->left=NULL;
else if(q->left!=NULL&&q->right==NULL){f->left=q->left;}
else if(q->right->left!=NULL)
{find=fin(q->right);p=find->left;find->left=NULL;p->left=q->left;p->right=q->right;f->left=p;}
else if(q->right->left==NULL){q->right->left=q->left;f->left=q->right;}
}
else if(q!=NULL&&f->right==q)//q是其父节点f的右孩子时
{
jie *find,*p=NULL;
if(q->left==NULL&&q->right==NULL)f->right=NULL;
else if(q->left!=NULL&&q->right==NULL){f->right=q->left;}
else if(q->right->left!=NULL)
{find=fin(q->right);p=find->left;find->left=NULL;p->left=q->left;p->right=q->right;f->right=p;}
else if(q->right->left==NULL){q->right->left=q->left;f->right=q->right;}
}
}
int main()
{
int a[11]={};//a[0]忽略不用
printf("请输入11个整数:\n");
for(int i=1;i<=10;i++)
{
scanf("%d",&a[i]);
}
system( "cls ") ;
cout<<"在插入二叉排序树之前的序列顺序:\n";
for(int i=1;i<=10;i++)
cout<<a[i]<<"\t";
cout<<"\n";
jie *root=NULL;//定义二叉树的根
create(&root,10,a);//以数组a,以root为根构造二叉排序树
cout<<"二叉排序树构造成功!\n";
if(root==NULL)cout<<"空树\n";//p=root;
cout<<"中序遍历此二叉排序树,结果为:\n";
ergotic(root);cout<<"\n";//中序遍历
cout<<"请输入要删除的关键字:\n";
int sun;cin>>sun;
check(root,sun);
if(rut==false)cout<<"你输入的关键字不在树里\n";
else {del(root,sun);cout<<"删除以后中序遍历得到的结果为:\n";ergotic(root);}
cout<<"\n";
return 0;
}