二叉树——家谱管理系统
#include
#include
using namespace std;
class Node
{
friend class Person;
public:
Node():name(“?”),lchild(NULL),rchild(NULL){};
private:
string name;
Node* lchild;
Node* rchild;
};
class Person
{
public:
Person():root(NULL){};
void Create(Person& L);
void Add(Person& L);
void Delete(Person& L);
void Insert(Person& L);
void Update(Person& L);
void Show(Person& L);
void Print(Node* p);
Node* Lookup(Node* p,string name);
private:
Node* root;
};
void Person::Create(Person& L)
{
cout<<"请输入祖先的名字:";
string rootname;
cin>>rootname;
Node* p=new Node;
p->name=rootname;
L.root=p;
cout<<"此家谱的祖先:"<
void Person::Add(Person& L)
{
cout<<"请输入要创立家庭的人的姓名:";
string rootname;
cin>>rootname;
Node* s=Person::Lookup(L.root,rootname);
if(s){
Node* r=s;
cout<<"请输入"<
int n;
cin>>n;
int m=n;
cout<<"请依次输入"<
while(m){
string na;
cin>>na;
Node* p=new Node;
p->name=na;
if(m==n){
s->lchild=p;
s=s->lchild;
}
else{
s->rchild=p;
s=s->rchild;
}
m–;
}
Person::Print(r);
}
else{
cout<<"查无此人,请重新输入!"<
}
}
Node* Person::Lookup(Node* p,string name)//是否可以用分治查找
{
Node* t=NULL;
Node* s[100];
int top=0;
while(p||top>0)
{
while(p)
{
if(p->name==name)
{
t=p;
}
s[++top]=p;
p=p->lchild;
}
p=s[top–];
p=p->rchild;
}
return t;
}
Node* Person::Lookup(Node* p,string name)
{
Node* t=NULL;
if(p->name==name)
{
t=p;
return t;
}
Node* s=Person::Lookup(p->lchild,name);
Node* r=Person::Lookup(p->rchild,name);
if(s) t=s;
if(r) t=r;
return t;
}
void Person::Print(Node* p)
{
cout<
p=p->lchild;
while(p->rchild)
{
cout<
p=p->rchild;
}
cout<
void Person::Insert(Person& L)
{
cout<<"请输入要添加子女的人的姓名:";
string rootname;
cin>>rootname;
Node* s=Person::Lookup(L.root,rootname);
if(s)
{
Node* r=s;
cout<<"请输入"<
Node* p=new Node;
string name;
cin>>name;
p->name=name;
if(!s->lchild)
{
s->lchild=p;
}
else
{
s=s->lchild;
while(s->rchild)
{
s=s->rchild;
}
s->rchild=p;
}
Person::Print(r);
}
else
{
cout<<"查无此人,请重新输入!"<
}
}
void Person::Delete(Person& L)
{
cout<<"请输入要解散家庭的人的姓名:";
string rootname;
cin>>rootname;
Node* s=Person::Lookup(L.root,rootname);
if(s)
{
if(s->lchild)
{
cout<<"要解散家庭的人是:"<
s->lchild=NULL;
}
else
{
cout<
}
}
else
{
cout<<"查无此人,请重新操作!"<
}
}
void Person::Update(Person& L)
{
cout<<"请输入要更改姓名的人的目前姓名:";
string rootname;
cin>>rootname;
Node* s=Person::Lookup(L.root,rootname);
if(s)
{
cout<<"请输入更改后的名字:";
string name;
cin>>name;
s->name=name;
cout<
else
{
cout<<"查无此人,请重新操作!"<
}
}
void main()
{
cout<<" 家谱管理系统 "<
L.Create(L);
char ch;
while(ch!=’F’)
{
cout<<" 请输入要执行的操作:";
cin>>ch;
switch(ch)
{
case’A’:
{
L.Add(L);
break;
}
case’B’:
{
L.Insert(L);
break;
}
case’C’:
{
L.Delete(L);
break;
}
case’D’:
{
L.Update(L);
break;
}
case’E’:
break;
default:
cout<<"请输入正确操作!"<
}
}
相关阅读:
二叉树的常见问题及其解决程序 http://www.linuxidc.com/Linux/2013-04/83661.htm
【递归】二叉树的先序建立及遍历 http://www.linuxidc.com/Linux/2012-12/75608.htm
在JAVA中实现的二叉树结构 http://www.linuxidc.com/Linux/2008-12/17690.htm
【非递归】二叉树的建立及遍历 http://www.linuxidc.com/Linux