php能否实现一个这种形式的家谱树?给一个思路或者方法本人新手谢谢!!!
数据库这么建就好了
id | belongid | name | img
1 | 0 | 名字A | url //A为根,0代表根级别
2 | 1 | 名字B | url //B为A的分支
3 | 1 | 名字C | url //C为A的分支
4 | 2 | 名字D | url //D为B的分支
写家谱族谱的方法如下:把知道的都写下来、采访家人、寻找实物线索、绘制家族树、制定研究计划等。
1 把知道的都写下来
关于家里,你记得什么,就都写下来,特别是出生、结婚、死亡的日期和地点,后者将在未来的实地调研中发挥重要作用。你或许还可以绘制简单的家族树。这将提醒你已经知道了什么,还想知道什么。
2 采访家人
现存的家族成员是知识的宝库。从父母以及他们的兄弟姐妹开始,然后如果可以,就再采访祖辈。如果祖辈还能记起他们的祖辈,那么你就有机会接触百年以上的家族历史了。在采访的时候,如果方便,你可以录音。
这份资料,既有利于你未来的调研,也可以作为遗产传至后人。但要记着贴上标签,以便寻找。要注意名字。还要记下别名、绰号,等等。一个故事,可能有不同的说法,要进行比较。要注意搜集“谣言”或者“模糊的回忆”。
3 寻找实物线索
翻翻抽屉和箱子,你可能会为自己的发现而感到惊奇。显而易见,诸如证书、表格之类的文件,可能会成为家族历史的砖石。这有可能了解到一段不为人所知的往事。
留意其他家族遗物,例如日记本、信函。照片也是非常重要的道具。跟亲戚聊聊,看看他们能否辨认照片上的人物。记下名字,扫描照片,贴上标签。最后,也是最重要的,打听一下家人、亲戚和族人,是否有家谱。
4 绘制家族树
家族树是描绘祖先关系的地图。它可能花费时间,所以要肯付出才能有结果。拿出一张白纸,在页底写下你自己的名字,在上面为先辈们留出空白。你也可以使用电脑。如果你是已婚,配偶列在你的旁边。然后在你们下面添加孩子,并填上出生日期。
上面是父母,再上面是祖辈,并且填上出生日期。你追溯的时候,直系祖辈的数量会翻倍——四位祖辈,八位曾祖辈,等等,加上他们的出生日期、结婚日期和死亡日期。
5 制定研究计划
记忆因时光变得模糊,所以验证非常重要。跟官方记录核对姓名和日期,常常都是不错的主意。现在可以查阅许多出生、结婚和死亡证书。你可以试着去本地档案馆、图书馆查询。
户籍档案也是查询数据或者未知亲戚的方式。民国时期的户籍资料,一般存放在档案馆里。另外,在地方志馆,也可以通过查阅地方志和文史资料,了解祖辈的生活环境和可能经历的大事,运气好的话,还可以找到他们的名字和事迹。
除了本地资源,网络资源、图书、杂志或者报纸,也可能提供实际的帮助。需要特别指出的是,图书馆里也收藏了大量的家谱和地方志。图书馆领导曾经讲过,有1/5的中国人其实是可以找到自己的家谱。
问题一:族谱是怎样写的 家谱的七大主要内容。
一 姓氏源流
姓氏源流就是同一族得姓的来源与变迁,中国人的姓氏渊源大多很为古老,假若没有古书或旧谱 的记载,后人就很难考究得清楚。从一姓到一国一家,不能不知晓自己根源来自何处,认清自己 的姓氏来源,每套《家谱》都详细介绍了自己姓氏源流,这样才能世世代代承继,也能将族系根缘流传千百年。
中国姓氏在经过历史不断演变,如:战乱,迁移,改朝换代,以及避讳改姓、避难改姓、复姓改为单姓等,姓氏变得更为复杂,其真正的出处、源头就更需要详细考证了,《家谱》中有详细记载。
封建时代,许多姓氏为了抬高自己的门第和郡望,习惯于与名人扯上关系,或硬追溯到某皇帝作自己的祖先。却不知道,这影响了血缘的纯正和确实性,后人不可不慎。
《家谱》中有“叙本系、述始封”的传统,它的目的也在于“明世次、别亲疏”以及考订姓氏源流。 《家谱》均有记载姓氏的一章,以叙述家族得姓的来源,或是家族因某种原因改姓的历史。所以《家谱》中的姓氏源流就变得很重要,它是明辨您家族血统的证明文献。
二 堂号
堂号是一个姓氏的特殊标识,它能显示姓氏发源的地缘关系。在家谱中,堂号具有联系姓氏与宗族关系 的意义,也是后代寻根问祖的重要线索之一。
堂号名称一般取自于郡号名或为纪念家族史祖或名人而自创。
一般来说,堂号多取自于郡号名,郡是秦、汉时期对行政区域的建置, 郡号名又取自于郡名,或诸侯国名, 地方府、州、县名。随着姓氏家族的发展壮大,就出现了以各姓氏名门望族发祥地的郡名作为郡号的由来。
大家族日久人众,或是遇至天灾连年之时,族人就会因迁徙流离,而散布各地。于是就有了在“总堂号”之下, 再加入“分堂号”名称的方法。 “总堂号”代表家族(姓氏)的发祥地,寓后人以不忘本源,“分堂号”则是族人迁徙至新地,成为当地有名望家族后,以该地的郡号作为堂号,“总堂号”和“分堂号”统称为“郡望”。
因为各族姓基本上都是以郡名作为自己家族的郡号,所以就有了若干姓氏同为一个堂号的现象。例如:王,胡 这两个姓的郡望都是“清河堂”。
堂号名称的另一出处:自创堂号,乃家族中人自立的堂号,该堂号名称一为有别于各姓氏的分支别派,二为铭记祖先或名人的公德事迹或教诲。例如:杨氏的“四知堂”寓意“天知、地知、我知、子知”的为人风范。
三 世系表
如果发现一本关于您身世的家谱,您最想看的是什么哪?是不是想知道自家的祖先是谁?家族中曾有过哪 些名人、功绩?家族中人现在哪里?等等,所有的答案就在家谱的世系表中。
作为家谱中最重要的内容,“世系表”,简而言之,就是说明一个家族成员, 如:父子、兄弟间的相互关 系,写清楚祖先后代每一个家族成员名字的图表。它有四种基本的记述格式:欧式、苏式、宝塔式和牒记式。
欧式:又称横行体,是北宋文学家欧阳修创立的。欧式的特点是:世代分格,由右向左横行,五世一表, 用起来很方便。欧式中,每个世代人名左侧都有一段生平记述,介绍该人的字、号、功名、官爵、生辰年月日、 配偶、藏地、功绩等。
苏式:又称垂珠体,是北宋文学家苏洵创立的。苏式世系表的特点是:世代直行下垂,世代间无横线连接,全 部用竖线串连,图表格式也是由右向左排列的,主要是强调宗法关系。
宝塔式:顾名思义,就是将世代人名象宝塔一样,由上向下排列。宝塔式采用横竖线连接法,竖线永远处在横线 的中间,这对人多的大家族来说,因人名不可能排在同一页纸上,兄弟之间长幼关系不清,会为写谱、看谱带来 很多不便。
牒记式:不用横竖线连接世代人名间的关系,而是纯用文字来表述这>>
问题二:如何编写族谱? 没必要一定用纸质的家谱慢慢修,尝试下电子家谱哦。可以边修家谱边寻根,实用,我们村都是用个这个同心圆家谱,百姓通谱网的、
问题三:家谱怎样填写 大体上家谱中简历填写如下:世次(如坤十三)-名-排行(某公第几子)-字号别名-履历(职务)――生卒(时辰年岁)-婚配(川明家世、生卒时辰年岁)
问题四:家谱的格式怎样写啊,需要些什么内容。说简单一点 古代的家谱在选官、袭爵、婚姻、社交、财产继承、睦族等方面都有着重要
的作用。因而,在编修家谱时,都应把这些方面的内容收录进去,以传示时人和
后人。从家谱产生之时起,三千多年来,由于时代的不同,家谱内容的侧重也有
所不同。上古时期的家谱,仅为君王诸侯和贵族所独有,家谱的作用仅为证明血
统,是为袭爵和财产继承服务的,关于这点,可从甲骨实物和《史记》中的有关
部分得到证实。先秦时期的家谱特别重世系,家谱的内容也比较单一,仅为世
系。魏晋以后,选官、婚姻以至社会交往均看门第,这样一来,家谱在政治生
活、经济生活和社会生活中的作用就大大增强,家谱的内容也相应比以往有所增
加。魏晋以至唐代的家谱现在已基本无存,从现存的其他一些著作所引的零星文
字和后人再整理的资料来看,仍可了解到一些基本情况。魏晋至唐代家谱的内容
大致包括:郡望、源流、家族世系。当然,首先书写的还是姓名,姓名包括字、
号,还包括小名、异名、别名,然后记载生平,官爵(即使没有做过官,是处士
也记录上谱),生卒年及特殊死亡原因(如何时、何故遇害等等),婚姻状况
(妻妾姓名、排行,岳家门第,离、退婚等等),兄弟姐妹及子女的做官、婚配
情况,以及著述、居住、迁徙、家族支系、坟墓等等,其中尤以地望,家世,官
爵,自己及兄弟姐妹、子女的婚配等情况,记录得比较详细。
宋代以后,家谱在政治生活中不再发挥作用,家谱的作用转移到尊祖、敬
宗、睦族上,因而,家谱的内容也发生了一些变化。宋元时代的家谱流传极少,
明代的家谱现在保存较多,分析一下,宋代以后家谱基本上去掉了关于岳家的内
容,而把记录的重点移到有关祖先、世系、恩荣、祠堂、居住、田产、坟墓等方
面,尤以子嗣和与血统有关的内容记载特详,但如岳家家世显赫,也可写上。宋
代以后家谱的内容通常包括:1、族姓源流,一般总要上溯到家族的始祖,大多
上托帝王、名人,以表谱形式,列出家族流传世系。2、恩荣,记录本家族列祖
列宗的诸如科举、仕宦以及受到 褒奖等情况,即使没有做过官,也要写上处
士,实在没有可写的,年纪活得大,则写上耆寿、寿妇等字样,努力使自己的家
族门楣生光。3、对每一个入谱之人,尤其是家族的重要人物,一般都写有传
记,详细记录他的名字、号谥、婚姻、生死经历、登谱之年、妻妾、节孝,其中
对子嗣记录得特别认真,严格掌握入谱标准,对诸如养子、私生子、女儿、11岁
以下死亡的幼殇以及人赘等情况,特别慎重,以防出现“冒宗”、“乱宗”之
事,保证血统的纯净。4、祖宅是先人们居住、生活过的地方,祠堂是祭祀祖先
的场所,祖茔是列祖列宗长眠之地,尊崇祖先对于团结族人有着极大的意义,故
对祠规、祠记、祠产、义庄、义田、家礼、家训及祖茔、祖屋的地形图等也记载
较详。5、最后是家传,一般收录有声望的先人的墓志铭、行状、寿序、年谱、
像赞等传记资料。有些家谱后面还专列著述或艺文一节,收载家族先人的著述、
诗文等。
中国古代的家谱,因为时代不同,作用不同,因而,记录的内容也不完全相
同,大致看来,越到后期内容越多,越到后来记录越详,与之相适应的是,家谱
的格式在不同时代也不尽相同。
商周甲骨、青铜家谱仅录世系,格式上是每人一行,说明关系,较为简单。
汉代的家谱格式大致有三种:一为横格表制,分代分格,按时代顺序排列,《史
记》中有关各表是其代表;二是以姓名为单位,先叙得姓起源,再述世系和官
位;三是一贯连写,汉代流传至今的两块碑文《孙叔敖碑》和《三老赵宽碑》是
其代表。魏晋南北朝是分行写,或连行写,每代与前代空一格,这从现存北魏薛
孝通贻后券>>
问题五:如何撰写家谱 家谱,又称族谱、家乘、宗谱、公谱、祖谱、谱书、家牒、族牒。它是记录家族组织活动的档案材料。福建的族谱兴于宋代,盛于明清之后。修谱的动机是“溯渊源,分疏戚,序尊卑。”(安溪《谢氏总谱》卷首《联谱序》)族谱的形式有装订成册的(古为线装,今与一般印刷物相同),也有图表式的。许多家族把编纂族谱作为后代子孙的一项义务写进族规,重修族谱年限不等。闽北浦城的季氏和李氏家族,均规定族谱30年一修。房氏则规定“宗谱有贤子孙或十年、三十年一修,则存没葬地,时日不爽。先儒云,一世不修谱为不孝,宜知之。”(清・光绪《闽浦房氏族谱》)类似的族规,使修谱用家族法的形式永久化了。
族谱所载内容详略不一,通常除记载全族的户口、婚配和血缘关系外,还有全族的坟墓、族田族产、祠庙等的方位、数量及管理使用办法、家族的规约训诫、修谱凡例义则、各类合同契约文书等。一些较详的族谱,还记载有家族历代的重大事件、与外界的纠纷、可嘉奖的人物传记、科举出仕、名人传记以及义行节烈等。
族谱的核心内容是记载家族的世系源流、血缘系统。以防血缘关系紊乱而导致家族瓦解。连城《新泉张氏族谱》卷首说得明白:“亲疏派别得谱则溯其源,上下分支得谱则穷其本,即荡析代变,而皆有所考焉。”为达到显示血统的目的,各地族谱均有认中国先朝名人为远祖的习俗,这种附会的谱风,虽能使其家系倍增光彩,但往往导致家史失真和对后代误导。安溪湖头的李氏宗谱,认先祖为道教创始人李耳,直系则“出陇西,为唐高祖李渊公之苗裔。”南靖庙兜郭姓,认始祖为周文王之弟“虢叔”(“虢”与“郭”音近),并由虢叔是黄帝的二十七世裔孙,郭子仪是虢叔的第六十世孙、黄帝的八十七世裔孙,而推论自己的宗族嫡出于中唐名将郭子仪。(《南靖文史资料》第二期89页《庙兜郭姓的历史渊源》何柳枝)这些记载,易使族人深信不疑。其他的如刘姓必溯祖为刘邦,肖姓多探源为萧何,都是这种攀强名流、附会望族的修谱心态之反映。
族谱中,家族迁居(开基)始祖之下的代系排列严格分明,不容混淆。这往往是族谱中最具史实价值的部分。福建的许多家族,都实行名字排行制(古称“昭穆”),俗称“排辈份”。即在同一辈份的族人中名或字须用某个统一规定的单字起头,再与其他单字结合成名或字,以示区别。如某一父辈生三子,儿辈名按“永”字排列,分别称“永志”、“永仁”、“永贵”。如此,在族谱中一看“永”字排行便可知其为兄弟或堂兄弟辈份。已去世者,则在其名上写上谥称并加上“公”字,以示区别,沙县一带习俗,收养子若无族长和六亲认可,不可上谱排字辈,否则会被骂为“出透的人”而遭岐视。排辈份除少数由祖、父辈临时决定外,大多是按先祖早已选定的排行用字。南靖县双峰村《丘氏族谱》载:从其二十一世始,标定的昭穆用字是:“文章 ,诗礼传家。创垂显奕,继述藏嘉。光前荣耀,世德作裘。仁亲义祖,燕翼贻谋。桂芳兰茂,日新月盛。思皇多佑,福禄来成。庆余善积,谱泽绵延。宗风丕振,亿万斯年。”(《南靖文史资料》第二期86页《双峰丘氏的历史渊源》林明波)目前已传至“垂”、“显”字辈,即第三十至三十一世。这种按族谱排辈份的方法,使农村常可见到这样的俗象,由于世系分支发展速度不一,一些年届七旬的老翁,要向三岁稚童称“叔”或“伯”。永定俗谓:“白头哥,坐地叔”(即对平辈的白头老翁仅呼“哥”,而尚在襁褓中的叔辈,即使上年纪老者也要唤其为叔)。为了区别同辈中的年龄次序,“排辈份”之外还要“排号”。永泰县同安乡张氏族谱规定,族人添丁按先后次序排号,日常称呼常舍其名而直呼其号,如同辈中是第20个出生的,就直呼“二十”以代名字。这一习俗在当地一>>
问题六:我想写家谱,怎样写 嗯嗯, 这位仁兄,你说的自己想编撰自己姓氏的家谱吗?
jiaz 这网站有各个姓氏家谱,供你参考
问题七:如何编写家谱世系图 世系图是家谱中的主体部分,又称为世系考、世系记等。这部分内
容为所有中国家谱共有,因而成为家谱区别于正史、地方志的最明显的
标志。世系表有两种格式比较常见:(1)宝塔式图谱:这一图谱形式何
人所创、创于何时目前尚无定论,不过最迟已在南宋时出现了,因此很
可能也是北宋人的产品。
现在在宝塔式图谱的基础上发展了很多种类如
1、树系图谱:(典型的宝塔式)
2、线形图谱(平行谱)
一世 二世 三世 四世 五世
(2)牒记式图谱:这一图谱的特点是分别按世代以文字叙述先人的事迹,
既不用线条,也不用图表。
当然还有很多谱系图如龙凤家谱(其结构是中间是世代,左右两侧
分别是祖妣、祖考,也就是父母亲。因此,称此种家谱为龙凤家谱)、
欧阳修、苏洵所发明的欧式图谱和苏式图谱等等,但基本上都是在以上
两种谱系图的基础上发展起来的,区别不是很大。常用的谱系图以树系
图谱和线索图谱最为常见。
以word 2007为例,方法如下:
1、依次单击“插入”、插图框中的“SmartArt”,在出现的对话框中选择“层次结构”、在右边出现的“组织结构图”中选中竖排或横排的结构图例,双击出现的“文本”,填写家谱姓氏辈份等信息。
2、家族人丁兴旺的可以在不同的辈份(行或列)添加多个文本,具体方法是点击想要添加位置附近文本框,在菜单栏中点击“添加形状”,在子菜单中选择在后、前、上、下添加即可。
3、页面布局可以设置为横板,纸张设置大些,因为家谱人员太多,一张A3横板往往都写不下。
C++语言: 二叉树实现的简单家谱树
/
File Name: BiTreecpp
Author: Geng Lequn[glq2000@126com]
Thur July 1 2010
Discription: 建立二叉家谱树,实现输入任意两个人的名字,查找得到其关系
/
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <mathh>
using namespace std;
typedef struct _Node
{
string sex; //性别 m 男; f 女
string name; //此人的姓名
string spause; //配偶的姓名
unsigned short level; //层次 辈分最高一层为1,下一层为为2,以此类推
struct _Node l_child; //指向其第一个孩子的指针
struct _Node r_brother; //指向其某一个兄弟姐妹的指针, 即左孩子为其后代,右孩子为其兄弟姐妹
struct _Node btr; //指向其父亲或者母亲的指针
_Node():level(0),l_child(NULL),r_brother(NULL),btr(NULL){cout<<"constructor"<<endl;}
~_Node(){cout<<name<<" destructor"<<endl;}
}Node, PNode;
void CreateBiTreePreOrder(PNode &pn, PNode pback, unsigned short depth);//建立二叉家谱树,以先序方式
void VisitBiTreePreOrder(PNode root); //前序遍历此二叉树
void TellRelation(PNode root); //判断两人关系
void DestroyBiTreePostOrder(PNode root); //销毁二叉树,释放节点占用的空间
void FindPersonMiddleOrder(PNode root, string name, PNode &presult); //返回家谱中指向某人的指针,找不到返回NULL
Node root=NULL; //全局变量,二叉树的根节点
unsigned findPersonFlag = 0; //标志位,0 没找到; 1 找到,找到后就不再搜索直接返回;利用此flag可避免将整个tree遍历一遍(若该name在tree中存在的话)
int main()
{
cout<<"请按先序遍历的顺序根据提示输入家谱信息,不存在则输入\"#\""<<endl;
CreateBiTreePreOrder(root, NULL, 1);//建立二叉家谱树,以先序方式
VisitBiTreePreOrder(root); //前序遍历此二叉树
TellRelation(root); //判断两人关系
DestroyBiTreePostOrder(root); //销毁二叉树
getchar();getchar();getchar();
return 0;
}
/
function:建立二叉家谱树,以先序方式
argument:
pn: 指向二叉树节点的引用
pback: pn这个节点的btr指针的值,即指向其parent的指针
depth: 该节点的层次,分最高一层为1,下一层为为2,以此类推
/
void CreateBiTreePreOrder(PNode &pn, PNode pback, unsigned short depth)
{
string str;
cin>>str; //输入该人信息,格式是 sex-name-spausename,如不存在则输入#
if(str == "#") //如: M-tom-marry, 表示此人叫tom, 男性, 配偶名字marry
{
pn = NULL;
return;
}
//如果是自定义的struct/class,应该使用构造函数。如果是内建数据类型,
//比如int,应该memset。 当然,更好的建议是使用vector取代new出来的数组
pn = new Node;
//处理输入的字符串
vector<string> v;
for(size_t b=0, e=strfind('-'); ; e=strfind('-', b))
{
if(e == string::npos)
{
vpush_back(strsubstr(b));
break;
}
else
vpush_back(strsubstr(b, e-b));
b = e+1;
}
//初始化该节点
pn->sex = v[0];
pn->name = v[1];
pn->spause = v[2];
pn->btr = pback;
pn->level = depth;
//递归建立左右子树的节点
CreateBiTreePreOrder(pn->l_child, pn, depth+1); //注意后两个参数的值
CreateBiTreePreOrder(pn->r_brother, pback, depth); //注意后两个参数的值
}
/
function: 前序遍历此二叉树
/
void VisitBiTreePreOrder(PNode pn)
{
if(!pn)
return;
cout<<endl<<"sex:"<<pn->sex<<endl;
cout<<"name:"<<pn->name<<endl;
cout<<"spause:"<<pn->spause<<endl;
cout<<"level:"<<pn->level<<endl;
cout<<"father's name:"<<((pn->btr == NULL)"NULL":pn->btr->name)<<endl;
cout<<"======================"<<endl;
VisitBiTreePreOrder(pn->l_child);
VisitBiTreePreOrder(pn->r_brother);
}
/
function: 中序遍历找到家谱中的一个人,返回其指针,若找不到,返回NULL
isSpause 1表示是找到的节点的配偶 0表示不是所找到的节点的配偶
/
void FindPersonMiddleOrder(PNode pn, string name, PNode &presult)
{
if(!pn)
return;
FindPersonMiddleOrder(pn->l_child, name, presult);
if(findPersonFlag) return;
if(name == pn->name || name == pn->spause)
{
presult = pn;
findPersonFlag = 1; //全局标志位,0 没找到; 1 找到,找到后就不再搜索直接返回;利用此全局flag可避免将整个tree遍历一遍(若该name在tree中存在的话)
return; //下次使用前不要忘记置为0
}
FindPersonMiddleOrder(pn->r_brother, name, presult);
}
/
function: 判断两人关系,若两人中至少一人不在树中,则两人无关系
若两人在树中,先判断两人是否同层次,若同层,判断是否是亲兄弟姐妹;
若不同层,设辈分大的人为A,辈分小的人为B,判断A和B是亲的还是表的,
比如,A为男性,且比B大一倍,判断A是否为B的爸爸,或亲叔叔(舅舅),或表叔叔(舅舅)
简单起见,此处没有区分是叔叔还是舅舅
比如,A为男性,且比B大两倍,判断A是否为B的亲爷爷(姥爷),或亲爷爷(姥爷)的亲兄弟
,或亲爷爷(姥爷)的表兄弟
简单起见,此处没有区分是叔叔和舅舅等做进一步区分
简单起见,查询时只输入节点中的name,不查询spause,否则处理起来太麻烦
/
void TellRelation(PNode pn)
{
string name1, name2;
//p1指向name1, p2指向name2, pbig指向辈分大的,psmall指向辈分小的
PNode p1 = NULL, p2 = NULL, pbig = NULL, psmall = NULL;
int differ = 0; //两人辈分数的差别
string title;
Label:
cout<<endl<<"输入想查询关系的两个人的名字,不想查则将两人名字输成#:"<<endl;
while(cin>>name1 && cin>>name2)
{
if(name1=="#" && name2=="#") return;
p1 = NULL; p2 = NULL; //因为程序是循环执行的,需要将上次遗留的值清掉
findPersonFlag = 0;
FindPersonMiddleOrder(root, name1, p1);
findPersonFlag = 0;
FindPersonMiddleOrder(root, name2, p2);
if(!p1 || !p2) //若有一个为空或都为空,说明至少有一个人不在家谱中,故两人无亲缘关系
{
cout<<name1<<((!p1)" 不在":" 在")<<" 家谱树中"<<endl;
cout<<name2<<((!p2)" 不在":" 在")<<" 家谱树中"<<endl;
cout<<name1<<" 和 "<<name2<<" 间没有关系"<<endl<<endl;
goto Label;
}
differ = (int)abs(p1->level - p2->level);
if(!differ) //辈分一样大
{
if(p1->sex == p2->sex)
{
if(p1->sex == "M") title = "兄弟关系";
else title = "姐妹关系";
}
else title = "兄妹(姐弟)关系";
if(p1->btr == p2->btr) //parent相同
cout<<name1<<" 和 "<<name2<<" 间是 "<<" 亲 "<<title<<endl;
else
cout<<name1<<" 和 "<<name2<<" 间是 "<<" 表 "<<title<<endl;
}
else //辈分不一样大
{
if(p1->level < p2->level) {pbig = p1; psmall = p2;}
else {pbig = p2; psmall = p1;}
switch(differ)
{
case 1:
if(psmall->btr == pbig)
title = ((pbig->sex == "M")"爸爸":"妈妈");
else
{
if(psmall->btr->btr == pbig->btr)
title = ((pbig->sex == "M")"亲叔(舅)":"亲姑(姨)");
else
title = ((pbig->sex == "M")"表叔(舅)":"表姑(姨)");
}
break;
case 2:
if(psmall->btr->btr == pbig)
title = ((pbig->sex == "M")"爷爷(姥爷)":"奶奶(姥姥)");
else
{
string tmp = ((pbig->sex == "M")"兄弟":"姐妹");
if(psmall->btr->btr->btr == pbig->btr)
title = ((psmall->btr->btr->sex == "M")"爷爷(姥爷)的亲":"奶奶(姥姥)的亲") + tmp;
else
title = ((psmall->btr->btr->sex == "M")"爷爷(姥爷)的表":"奶奶(姥姥)的表") + tmp;
}
break;
default:
string tmp2;
PNode pt = psmall;
int n = differ-2; //计算"老"字 (即grand这个字) 出现的个数
for(int i=0; i<n; ++i)
tmp2 += "老";
for(int i=0; i<differ; ++i)
pt = pt->btr;
if(pt == pbig)
title = tmp2 + ((pbig->sex == "M")"爷爷(姥爷)":"奶奶(姥姥)");
else
{
string tmp3 = ((pbig->sex == "M")"兄弟":"姐妹");
if(pt->btr == pbig->btr)
{title = tmp2 + ((pt->sex == "M")"爷爷(姥爷)的亲":"奶奶(姥姥)的亲"); title+=tmp3;}
else
{title = tmp2 + ((pt->sex == "M")"爷爷(姥爷)的表":"奶奶(姥姥)的表"); title+=tmp3;}
}
break;
}
cout<<pbig->name<<" 是 "<<psmall->name<<" 的 "<<title<<endl;
}
goto Label;
}
}
/
function: 后序遍历销毁此二叉树,释放节点占用的内存空间
/
void DestroyBiTreePostOrder(PNode pn)
{
if(!pn) return;
DestroyBiTreePostOrder(pn->l_child);
DestroyBiTreePostOrder(pn->r_brother);
delete pn;
}
php能否实现一个这种形式的家谱树?给一个思路或者方法本人新手谢谢!!!
本文2023-10-19 06:19:19发表“资讯”栏目。
本文链接:https://www.lezaizhuan.com/article/288701.html