左孩子右兄弟二叉树实现家族家谱

/*
  Name: 家谱 
  Description: 本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息、插入家族成员、删除家族成员等功能。
*/
#include<string>
#include<iostream>
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:
              void Update(Person &L);     //家谱成员改名
              void Delete(Person &L);     //删除部分家庭成员
              void Insert(Person &L);     //添加单个家庭成员
              void Print(Node *p);      //显示部分家庭成员
              Node *Lookup(Node *p,string name);//查找某人
              void Add(Person &L);        //添加部分家庭成员
              void Create(Person &L);     //创建家谱
              Person()
              {
                      root = NULL;
              }
              
       private:
               Node *root;
};

//===============创建家谱=======================

void Person::Create(Person &L)
{
     cout << "请输入祖先的姓名:";
     string rootname;
     cin >> rootname;
     Node *p = new Node;
     p->name = rootname;
     L.root = p;
     cout << "此家谱的祖先是:"<< p->name <<'\n';
}
//================添加部分家庭成员====================
void Person::Add(Person &L)
{
     cout << "请输入要建立家庭的人的名字:";
     string rootname;
     cin >> rootname;
     Node *s = Person::Lookup(L.root,rootname);
     if(s)
     {
          Node *r = s;
          cout << "请输入:" << s->name << "的儿女人数:";
          int n;
          cin >> n;
          int m = n;
          cout << "请请依次输入"<< s->name << "的儿女的姓名:";
          //左孩子,右兄弟 
          while(m)
          {
                  Node *q = new Node;
                  string name;
                  cin >> name;
                  q->name = name;
                  if(m == n)
                  {
                       s->lchild = q;
                       s = s->lchild;
                  }
                  else
                  {
                      s->rchild = q;
                      s = s->rchild;
                  }
               m--;
          }
          Person::Print(r);
     }
     else
     {
         cout << "查无此人,请重新输入!" << '\n';
         Person::Add(L);
     }
}

//====================查找某人===============================
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;
}

//====================显示部分家庭成员=======================
void Person::Print(Node *p)
{
     cout << p->name << "的第一代子孙是:" <<p->lchild->name << '\t';
     p = p->lchild;
     while(p->rchild)
     {
                     cout << p->rchild->name <<'\t';
                     p = p->rchild;
     }
     cout << '\n';
} 

//====================添加单个家庭成员========================
void Person::Insert(Person &L)
{
     cout << "请输入要添加儿子(或女儿)的人的姓名:";
     string rootname;
     cin >> rootname;
     Node *s = Person::Lookup(L.root,rootname);
     if(s)
     {
          Node *r = s;
          cout << "请输入" << s->name << "新添加的儿子(或女儿)的姓名:";
          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 << "查无此人,请重新输入!" << '\n';
         Person::Insert(L);
     }
}
//====================删除部分家庭成员========================

void Person::Delete(Person &L)
{
     cout << "请输入要解散的家庭的人的姓名";
     string rootname;
     cin >> rootname;
     Node *s = Person::Lookup(L.root,rootname);
     
     if(s)
     {
          if(s->lchild)
          {
                       cout << "要解散家庭的人是:" <<s->name <<'\n';
                       Person::Print(s);
                       s->lchild = NULL;
          }
          else
          {
              cout << s->name << "尚未有家庭!";
          }
     }
     else
     {
         cout << "查无此人,请重新输入!" <<'\n';
         Person::Delete(L);
     }
}

//========================家谱成员改名==========================
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 << rootname << "已更改为:" << s->name << '\n';
          
     }
     else
     {
         cout << "查无此人,请重新输入!" <<'\n';
         Person::Update(L);
     }
}

//========================主函数============================
int main()
{
    cout<<"\n**              家谱管理系统                     **"<<endl;
    cout<<"==================================================="<<endl;
	cout<<"**           请选择要执行的操作 :               **"<<endl;
    cout<<"**              A --- 完善家谱                   **"<<endl;
    cout<<"**              B --- 添加家庭成员               **"<<endl;
    cout<<"**              C --- 解散局部家庭               **"<<endl;
	cout<<"**              D --- 更改家庭成员姓名           **"<<endl;
    cout<<"**              E --- 退出程序                   **"<<endl;
    cout<<"==================================================="<<endl;
	
	cout << "首先建立一个家谱!" << '\n';
	Person L;
	L.Create(L);
	
	
	char ch;	
	while(ch!='E')
	{
		cout << "\n请选择要执行的操作:";
		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 << "请输入正确的操作!" << '\n';
		}
	}
	return 0;
}


转载于:https://my.oschina.net/clear/blog/59705

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过孩子兄弟二叉树实现家族家谱的表示。在孩子兄弟二叉树中,每个节点有两个指针,一个指向其第一个孩子节点,另一个指向其兄弟节点。 我们可以定义一个Person类来表示家族中的每个人,每个Person对象包含以下属性: - name:姓名 - gender:性别 - father:父亲节点 - firstChild:第一个孩子节点 - rightSibling:兄弟节点 然后,我们可以通过构建Person对象之间的孩子兄弟二叉树来表示家族家谱。具体实现过程可以参考以下Java代码: ```java public class Person { private String name; private String gender; private Person father; private Person firstChild; private Person rightSibling; // 构造函数 public Person(String name, String gender) { this.name = name; this.gender = gender; this.father = null; this.firstChild = null; this.rightSibling = null; } // 添加子女节点 public void addChild(Person child) { child.father = this; if (this.firstChild == null) { this.firstChild = child; } else { Person sibling = this.firstChild; while (sibling.rightSibling != null) { sibling = sibling.rightSibling; } sibling.rightSibling = child; } } // 获取父亲节点 public Person getFather() { return this.father; } // 获取第一个孩子节点 public Person getFirstChild() { return this.firstChild; } // 获取兄弟节点 public Person getRightSibling() { return this.rightSibling; } } ``` 这样,我们就可以通过创建Person对象之间的孩子兄弟二叉树来表示家族家谱。例如,下面的代码表示了一个家族家谱: ```java Person grandpa = new Person("Grandpa", "Male"); Person dad = new Person("Dad", "Male"); Person uncle = new Person("Uncle", "Male"); Person son1 = new Person("Son1", "Male"); Person son2 = new Person("Son2", "Male"); Person daughter = new Person("Daughter", "Female"); grandpa.addChild(dad); grandpa.addChild(uncle); dad.addChild(son1); dad.addChild(son2); dad.addChild(daughter); ``` 其中,Grandpa节点是根节点,Dad和Uncle是Grandpa的子节点,Son1、Son2、Daughter是Dad的子节点。通过遍历这棵孩子兄弟二叉树,我们就可以输出家族家谱

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值