二叉排序的类模板形式

pbfordream 2013-01-04 05:08:50
#include<iostream>
using namespace std;
template<class T>
struct Node
{
T key;
};
template<class T>
struct bitree
{
Node<T>data;
bitree<T> * lchild;
bitree<T> * rchild;
};

template<class T>
class BSTree
{
public:
Node<T> *ST;
int len;
bitree<T> *t;
bitree<T> *f;
bitree<T> *p;
BSTree();
~BSTree();
void SearchBST(bitree<T> *t,T key);
void InsertBST(bitree<T> *(&t),Node<T> e);
int DeleteBST(bitree<T> *(&t),T key);
int Delete(bitree<T> *(&p));
void DeleteElem(T key);
void InDisplay(bitree<T> *t);
void Display();
};

template<class T>
BSTree<T>::BSTree()
{
ST=new Node<T>[maxsize];
len=0;
t=NULL;
}

template<class T>
BSTree<T>::~BSTree()
{
delete[] ST;
len=0;
delete t;
cout<<"成功销毁二叉排序树\n";
}

template<class T>
void BSTree<T>::SearchBST(bitree<T> *t,T key)
{
if(t==NULL||key==t->data.key)
{
if(key==t->data.key)
cout<<"找到"<<key<<"的节点"<<endl;
else
cout<<"不存在"<<key<<"的节点"<<endl;
}
else if (key<t->data.key)
SearchBST(t->lchild,key);
else
SearchBST(t->rchild,key);
}

template<class T>
void BSTree<T>::InsertBST(bitree<T> *(&t),Node<T> e)
{
ST[len]=e;
len++;
p=t;
while(p)
{
if(p->data.key==e.key)
{
cout<<"二叉排序树中已经存在值为:"<<e.key<<"的节点\n";
exit(1);
}
f=p;
if(e.key<p->data.key)
p=p->lchild;
else
p=p->rchild;
p=new bitree<T>;
p->data=e;
p->lchild=p->rchild=NULL;
if(t==NULL)
t=p;
else
{
if(e.key<f->data.key)
f->lchild=p;
else
f->rchild=p;
}
}
}

template<class T>
int BSTree<T>::DeleteBST(bitree<T> *(&t),T key)
{
if(!t)
{
cout<<"二叉排序树为空 无法删除\n";
return FALSE;
}
else
{
if(key==t->data.key)
return Detele(t);
else if(key<t->data.key)
return DeteleBST(t->lchild,key);
else
return DeleteBST(t->rchild,key);
}
}

template<class T>
int BSTree<T>::Delete(bitree<T> *(&p))
{
bitree<T> *q, *s;
if(!p->rchild)
{
q=p;
p=p->lchild;
delete q;
cout<<"成功删除"<<endl;
}
else if (!p->lchild)
{
q=p;
p=p->rchild;
delete q;
cout<<"成功删除"<<endl;
}
else
{
q=p;
s=p->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->data=s->data;
if(q!=p)
q->rchild=s->lchild;
else
q->lchild=s->lchild;
delete s;
cout<<"成功删除"<<endl;
}
return TRUE;
}

template<class T>
void BSTree<T>::DeleteElem(T key)
{
for(int i=0;i<len && ST[i].key!=key;i++)
if(i<len)
{
for(int j=i+1;j<len;j++)
ST[i]=ST[j];
len--;
}
}

template<class T>
void BSTree<T>::InDisplay(bitree<T> *t)
{
if(t!=NULL)
{
InDisplay(t->lchild);
cout<<t->data.key<<" ";
InDisplay(t->rchild);
}
}

template<class T>
void BSTree<T>::Display()
{
cout<<"查找表中的数据元素关键字依次为:\n";
for(int i=0;i<len;i++)
cout<<ST[i].key<<" ";
cout<<endl;
}

void main()
{
int m,l,i;
BSTree<int> a;
do{
cout<<"——————二叉排序树的基本操作——————"<<endl;
cout<<"————1.创建二叉排序树————————————\n"
<<"————2.插入元素———————————————\n"
<<"————3.删除元素———————————————\n"
<<"————4.查找元素———————————————\n"
<<"————5.中序遍历———————————————\n"
<<"————6.二叉排序树输出————————————\n"
<<"————7.退出—————————————————\n"
<<"请选择操作: ";
cin>>m;
if(m==1)
{
Node<T> e;
cout<<"输入要插入的数据元素个数\n";
cin>>l;
cout<<"输入"<<"个不同的数据元素\n";
for(i=0;i<l;i++)
{
cin>>e.key;
a.InsertBST(a.t,e);
}
}
else if (m==2)
{
Node<T> e;
cout<<"输入要插入的数据元素\n";
cin>>e.key;
a.InsertBST(a.t,e);
}
else if (m==3)
{
T key;
cout<<"输入要删除的数据元素\n";
cin>>key;
a.DeleteBST(a.t,key);
a.DeleteElem(key);
}
else if (m==4)
{
T key;
cout<<"输入要查找的数据元素\n";
cin>>key;
a.SearchBST(a.t,key);
}
else if (m==5)
{
cout<<"中序遍历的输出结果为\n";
a.InDisplay(a.t);
cout<<endl;
}
else if (m==6)
{
cout<<"二叉排序树输出\n";
a.Display();
cout<<endl;
}
else if (m==7)
cout<<"结束运行\n";
else
cout<<"输入代码非法 代码在0-7之间 请重新输入"<<endl;
cout<<"请继续选择操作";
}while (m!=7);
}
// 各位大神们这是我的课程设计啊,来不及了,插入函数可能有问题,二叉树构造不出来
...全文
199 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimette 2013-01-07
  • 打赏
  • 举报
回复
你弄好了 怎么结贴》、?
pbfordream 2013-01-04
  • 打赏
  • 举报
回复
中序遍历弄不出来,
jimette 2013-01-04
  • 打赏
  • 举报
回复
lz的问题是?》

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧