#include <iostream>
#include <typeinfo>
#include <string>
using namespace std;
template < typename T >
class bst
{
struct Node{
T data;
//int password;
//int name;
Node* L;
Node* R;
Node(const T&d):data(d),L(),R(){}
Node(const T&d,Node* l,Node* r):data(d),L(l),R(r){}
};
Node* rp;
int n;
public:
bst():rp(),n(0){}
void insert(const T&d){
insert(rp,new Node(d));
}
void insert(Node*& p,Node* d) //增
{
if(p==NULL) {p=d;n++;}
else if(p->data<d->data) insert(p->R,d);//将string转化成c风格字符串,再用strcmp比较
else insert(p->L,d);
}
void find(const T&d){
if(find(rp,d)!=NULL) cout<<"find OK!"<<endl;
else cout<<"find fail!"<<endl;
}
bool remove(const T&d) //删
{
Node*& p=find(rp,d);
if(p==NULL) return 0;
Node* pn=p;
if(p->L!=NULL)//**************insert没有对第二个参数进行检验,如果第二个参数为空,会出现最右边的子节点无法删除*********************
insert(p->R,p->L);
p=p->R;
delete pn;
//travel(rp);
--n;
return 1;
}
void updata(const T&t,const T&d) //改
{
if(remove(t)) //当remove中travel存在时 if语句中的insert都不起作用
{
//insert(rp,new Node(d));
insert(d);
}
}
Node*& find(Node*& p,const T&d) //查找
{
if(p==NULL||d==p->data) return p;
else if(d<p->data) find(p->L,d);
else find(p->R,d);
}
void travel(Node* rp) const{ //遍历
if(rp){
travel(rp->L);
cout<<rp->data<<' ';
travel(rp->R);
}
}
void travel() const{
travel(rp);
cout << endl;
}
~bst(){clear();}
void clear(){
clear(rp);
}
void clear(Node* p){ //清空
if(p!=NULL)
{
clear(p->L);
clear(p->R);
delete p;
}
}
int size()
{
return n;
}
int high()
{
return high(rp);
}
int high(Node*& p)const //树的高度
{
if(p==NULL) return 0;
int LH = high(p->L);
int RH = high(p->R);
return 1+(LH>RH?LH:RH);
}
};
template < >
class bst<string>
{
typedef string T;
struct Node{
T data;
//int password;
//int name;
Node* L;
Node* R;
Node(const T&d):data(d),L(),R(){}
Node(const T&d,Node* l,Node* r):data(d),L(l),R(r){}
};
Node* rp;
int n;
public:
bst():rp(),n(0){}
void insert(const T&d){
insert(rp,new Node(d));
}
void insert(Node*& p,Node* d) //增
{
if(p==NULL) {p=d;n++;}
else if((strcmp((p->data).c_str(),(d->data).c_str())>-1?0:1)) insert(p->R,d);//将string转化成c风格字符串,再用strcmp比较
else insert(p->L,d);
}
void find(const T&d){
if(find(rp,d)!=NULL) cout<<"find OK!"<<endl;
else cout<<"find fail!"<<endl;
}
bool remove(const T&d) //删
{
Node*& p=find(rp,d);
if(p==NULL) return 0;
Node* pn=p;
insert(p->R,p->L);
p=p->R;
delete pn;
//travel(rp);
--n;
return 1;
}
void updata(const T&t,const T&d) //改
{
if(remove(t)) //当remove中travel存在时 if语句中的insert都不起作用
{
//insert(rp,new Node(d));
insert(d);
}
}
Node*& find(Node*& p,const T&d) //查找
{
if(p==NULL||d==p->data) return p;
else if(d<p->data) find(p->L,d);
else find(p->R,d);
}
void travel(Node* rp) const{ //遍历
if(rp){
travel(rp->L);
cout<<rp->data<<' ';
travel(rp->R);
}
}
void travel() const{
travel(rp);
cout << endl;
}
~bst(){clear();}
void clear(){
clear(rp);
}
void clear(Node* p){ //清空
if(p!=NULL)
{
clear(p->L);
clear(p->R);
delete p;
}
}
int size()
{
return n;
}
int high()
{
return high(rp);
}
int high(Node*& p)const //树的高度
{
if(p==NULL) return 0;
int LH = high(p->L);
int RH = high(p->R);
return 1+(LH>RH?LH:RH);
}
};
//class Person{
// int age;
// string name;
// /*Person* L;
// Person* R;*/
//public:
// Person(string str,const int&d):age(d),name(str){}
// Person(const int&d,Person* l,Person* r,string str):age(d),name(str){}
// friend bool operator<(const Person& a,const Person& b){
// return a.age<b.age;
// }
// friend bool operator==(const Person& a,const Person& b){
// return a.age==b.age;
// }
//};
class Person{
string name;
int age;
public:
Person( int age, const char* name):name(name),age(age){}
friend ostream&operator<<(ostream&o,const Person&p){
return o<<p.name<<':'<<p.age;
}
friend bool operator<(const Person& a,const Person& b){
//return a.age<b.age; //出错
if(a.age < b.age) return 1;
else return 0;
}
friend bool operator==(const Person& a,const Person& b){
return a.age==b.age;
}
};
int main()
{
bst<string> admin; //其他的都差不多,指针类型不一样
admin.insert("admin");
admin.insert("admin123");
admin.insert("admin888");
admin.insert("XSS");
admin.insert("beef");
admin.insert("IIS5.X/IIS6.0");
admin.insert("a.asp;.jpg");
admin.insert("a.asp/a.jpg");
admin.insert("apache");
admin.insert("a.asp.abd.aws.aqz");
admin.insert("IIS7.X");
admin.insert("*.jpg/*.php");
admin.insert("123");
admin.travel();
cout<<endl;
admin.find("admin");
admin.remove("123");
admin.travel();
cout<<"\n**********************\n";
admin.updata("admin","while");
admin.travel();
cout << "树的大小:" << admin.size() << endl;
cout << "树的高度:" << admin.high() << endl;
bst<int> in;
in.insert(120);
in.insert(220);
in.insert(320);
in.insert(20);
in.travel();
in.remove(120);
in.travel();
Person a(12,"Alice");
Person b(1210,"彭殇");
Person c(430,"帝弑天");
Person d(120,"帝释天");
bst<Person> test;
test.insert(a);
test.insert(b);
test.insert(c);
test.insert(d);
test.travel();
test.find(c);
test.remove(b);
test.travel();
cout << "树的大小:" << test.size() << endl;
cout << "树的高度:" << test.high() << endl;
system("pause");
return 0;
}
自定义结构体通过模板实现
最新推荐文章于 2023-09-30 18:00:27 发布