请问在latex里如何绘制这样的家谱和连线?谢谢!

栏目:资讯发布:2023-09-22浏览:2收藏

请问在latex里如何绘制这样的家谱和连线?谢谢!,第1张

用 TikZ 可以

效果:

效果

代码:

\documentclass{standalone}

\usepackage{ctex}

\usepackage{pifont} %\ding

\usepackage{tikz}

\usepackage{color}

\usetikzlibrary{positioning} % 相对放置 of

\usetikzlibrary{calc} % 计算两个节点

\usetikzlibrary{bending}

\usetikzlibrary{arrowsmeta}

\begin{document}

\begin{tikzpicture}

\node (a) at (0,0)     {少典};

\node (b0) [right=of a] {\textcolor{red}{\ding{172}}};

\node (b) [right=-05em of b0] {轩辕};

\node (c) [right=of b] {昌意};

\node (d0) [right=of c] {\textcolor{red}{\ding{173}}};

\node (d) [right=-05em of d0] {颛顼高阳};

\node (e) [right=of d] {穷蝉};

\node (de) at ($(d)!05!(e)$) {};

\node (de1) [above=1ex of de] {};

\node (de2) [below=1ex of de] {};

\node (f) [right=of e] {敬康};

\node (g) [right=of f] {句望};

\node (h) [right=of g] {娇牛};

\node (i) [right=of h] {瞽叟};

\node (j0) [right=of i] {\textcolor{red}{\ding{177}}};

\node (j) [right=-05em of j0] {虞舜};

\node (ij) at ($(i)!05!(j0)$) {};

\node (k) [right=of j] {商均};

\node (e1) [above=1ex of e] {鲧};

\node (e2) [below=1ex of e] {女修};

\node (f10) [right=of e1] {\textcolor{red}{\ding{178}}};

\node (f1) [right=-05em of f10] {禹};

\node (j1) [below=1ex of j0] {象};

\node (l) [below=6ex of c] {青阳玄嚣};

\node (m) [right=of l] {蝺极};

\node (n0) [right=of m] {\textcolor{red}{\ding{174}}};

\node (n) [right=-05em of n0] {喾高辛};

\node (o0) [right=of n] {\textcolor{red}{\ding{175}}};

\node (o) [right=-05em of o0] {挚};

\node (bc) at ($(b)!05!(c)$) {};

\node (no) at ($(n)!05!(o0)$) {};

\node (o10) [above=1ex of o0] {\textcolor{red}{\ding{176}}};

\node (o1) [right=-05em of o10] {尧};

\node (o2) [below=1ex of o0] {契};

\node (o3) [below=1ex of o2] {后稷};

\node (ctrl1) at ($(f)!01!(g)$) {};

\node (ctrl2) at ($(o3)!05!(j0)$) {};

\draw (de) |- (e1)

    (de) |- (e2)

    ($(de)-(0,5em)$) -- ($(de)+(0,5em)$)

    (ij) |- (j1)

    ($(ij)-(0,5em)$) -- ($(i)!05!(j0)$)

    (bc) |- (l)

    ($(bc)-(0,5em)$) -- ($(b)!05!(c)$)

    (no) |- (o10)

    (no) |- (o2)

    (no) |- (o3)

    ($(no)-(0,5em)$) -- ($(no)+(0,5em)$);

\path (a) edge (b0)

    (b) edge (c)

    (c) edge (d0)

    (d) edge (e)

    (e) edge (f)

    (f) edge (g)

    (g) edge (h)

    (h) edge (i)

    (i) edge (j0)

    (j) edge (k)

    (e1) edge (f10)

    (l) edge (m)

    (m) edge (n0)

    (n) edge (o0)

;

\draw [red] (b0) to[bend left=50] (d0)

    (d0) to[bend right=30] (n0)

    (n0) to[bend right=30] (o0)

    (o0) to (o10);

\draw [red] (o10)  controls (ctrl1) and (ctrl2)  (j0);

% (o10) to[bend left=10] (j0);

\draw[red, arrows={-Stealth[inset=0pt, length=10pt, angle'=30]}] (j0) to[bend right] (f1);

\end{tikzpicture}

\end{document}

家谱是中国传统文化的一部分,它不仅对于家庭有着“明昭穆、辩世系”等功能,而且也是研究 历史 的重要史料来源。

中国家谱的 历史 源远流长。民国以前,家谱的修纂连绵不绝,至民国至今,家谱修纂也经历了几个重要时期。一是民国时期,这一时期由于国民党倡导,出现一个修谱的高潮,诸多国民党要员也都在这时候进行修谱。二是建国后的20世纪80—90年代,也迎来一个修谱的高潮。建国之后,族谱被视为封建的象征,遭到严重破坏,但改革开放以后,人们对族谱有了新的认识,开始不断修纂家谱。进入新世纪之后,修谱更是频繁。

民国高官家族修谱时蒋介石的题词

但新世纪修谱,和以前的宗族修谱有很大不同,需要解决的问题有很多。首先是资金的问题,不同于明清时期宗族,修谱的资金从族产扣除,现在修谱首先要解决的就是资金问题。再者就是世系的编纂,新增了多少人口,具体世系如何,特别是像题主所说的,如果老谱遗失,新谱的修纂就会更加困难。那么该如何解决这两个问题呢?

近世修谱时的倡议书(为了保护隐私,此处仅截取了部分)

第一,资金问题 。当今修谱资金的主要来源是 捐款和均摊 ,一般都将这两种个方式相结合。

捐献主要是由家族中资金比较充足或者 社会 地位比较高的人进行捐款,这也是当今修谱资金的重要来源。当然,为了鼓励族人进行捐款,常常在家谱中载明某某捐款多少,如若捐的比较多,还会在家谱中详细载明家庭的照片以及家庭人员的光荣事迹。

均摊则比较简单,就是每户都要缴纳一定的款项,不同的宗族采取不同的方式,有的按照家庭进行,有的按照人丁捐款,通常都采取第二种。其缴纳具体数额不同地区也不同,有的人均10元,也有的人均20元等等。当然,是否缴纳采取自愿原则,但是不缴纳也不会载入家谱,所以还是带有间接性的强制性措施。

第二,世系编排问题

采访是不可避免的。 修谱人员需要每家每户的去采访,确定家庭具体的人口。这是一项极为复杂的工作,所以一般选择有一定名望的族人担任。而且如果可能,还需要跨越不同县市,甚至不同省份。

但这里就出现了题主所说的问题,如果家族有老谱,那一切都好说,只要按照以前的世系采访编排即可,但如果老谱遗失该怎么办呢

采访一定是必要的, 而且还要很仔细的进行采访,包括家庭男主人之上的若干代,都要尽可能的进行梳理清楚。而且, 这里也可以对族中年龄较大的老人进行采访 ,依据他们的口述史料进行汇总。

查找文献资料也是十分必要的 。这里的文献包括多种,方志、文集、旧报纸等等。但需要格外注意的是两种文献资料。 一是墨谱 ,所谓墨谱,是和传统意义上的家谱不同的,传统家谱都是出版的或者已经刊刻出来的,但是墨谱是未经刊载的,一般墨谱很难保存下来,但也有部分宗族会保留。 二是碑刻 ,明清时期碑刻都会比较完整的记载家族世系,这也是很重要的一份史料。

另外,还可以通过其他的一些方法进行考证。 比如联宗谱 。一般而言,每个家族都会有迁徙来源,通过去迁徙地进行考察,也有一定的几率找到之前的家谱,在这个基础上进行采访汇总,能够形成新的家谱。

当然,如果实在找不到相关记载,在新修家谱时,先将现存可以考证的世系资料编纂出来,不清楚的部分可以待后续进行考证。

当然,新修家谱是一个复杂的过程,通常都会组成一个修谱委员会,进行统筹分配,如总修人、会计、采访人员等等。

比较复杂。要看失续的年代是否久远。可以从现代往上推,看是否联系上老谱,(老谱上记载的详细更好)。你属于哪支,住哪个村,每一辈弟兄几人,(这些信息老谱上都有记载),多和年龄大的,辈份长的交流。现在人口流动性很大,迁徙频繁,续谱更难。小传中可写清楚原住何村,现居何地(地址要写清楚)。现在,年轻人多不太重视修谱,但仍要二三十年修一次,这就需要家族中要有热心公益之人,有志者事竟成。我大伯退休教师,一个人跑了四年,几十个村庄,完善了谱系,又写了小传,及文献,修了支谱,为本支五千人及安徽蚌埠常氏家族作出了贡献。本人于2017年9月份,下定决心,通过各种方式,找到了1871年(1992年老谱记载。)迁至南京鼓楼区,最近两、三代人与老家失去联系几十年的南京一支人,参于2017年修谱,圆了他们与老家宗亲们的团聚梦!

中国人非常重视修家谱,讲究慎终追远,传承有序。家谱失传的现象也很普遍,远因是战争和灾害,近因是破四旧和人口流动加速。

我家的家谱也在文革中烧掉了,我父亲在2000年退休以后,用了七、八年的时间重新整理出来,他的办法主要有这么几个:

1回忆。我的祖父是1978年去世的,大概在1976年前后,我父亲就请他老人家回忆族谱。我们这一支落户到本地后,传到我祖父是第七代,从我祖父之前,一直是长房,族谱和牌位(神柱)一直放在我家,虽然被当做四旧破掉了,但是祖父记忆力极好,他口述的内容被我父亲记录下来,基本上已经很完备(缺部分生卒年月和女配偶姓氏)。我父亲又多次回村里咨询老人,又充实修正了一些内容。这是恢复家谱最重要的办法。

2走访。全县有近千个自然村,有吕姓的村子大概有200多个,父亲骑车着电动车,用七八年的时间逐个走访(有些村子去了四五次),一方面梳理清楚了本县吕姓的来龙去脉,播迁流转次序,另一方面也充实订正了我们的家谱(因为在一些较近的支脉里,颇能获得臂助)。我父亲根据几年来的调研资料,写下了几万字的“市吕姓源流考”,为后来者深入研究提供了方便。这是第二个重要手段。

3查阅地方史志。这个方法可以在大的节点上提供一些帮助,对细节帮助不大。

4可以在网上查找本姓的宗亲会,也能有所收获。

最难的就是李姓,没有一个统一的字辈。我自己今年47岁,李姓,根据老谱记载。2015开始,到2017年。终于把本村本族所有的人员统一进行了续撰。老谱是清四旧时放在窗台底下用泥土泥在墙里才幸免于难。后来我的一个大爷爷保管着。大爷爷在2001年去世了,六十多年了基本木续过谱。我是一个乡村医生,利用农村人参加合作医疗保险的档案管理。我通过电脑把族谱续撰了!自己感到好欣慰。真的好累续撰族谱。我没有让族里人花一分钱。!!!顺便说一下,我族是明景泰三年从江苏东海迁徙到山东莒邑!

这个问题,我来回答,很是适合,因为我们唐氏家族也正在准备重修族谱,和题主所描述的一样,我们家族的族谱也已经失传。

首先说,为什么要修谱续谱?

参天之树必有其根,万里江河必有其源。普天下炎黄子孙一脉相承,说世系,道宗族,辩亲疏,以延宗亲之道。国有史,县有志,族有谱,同为一理。

此为修谱续谱之初衷。

过去,每个家族,都会有族谱,历经续修,完整规范,世代相传,长期保存。

但是,经过那个时期破四旧,族谱遭毁失,宗祠遭破坏,祖宗牌位也都损坏,导致后来家族字辈都变得混乱。

到了现在这个太平时代,大家都认识到修谱续谱的重要性,很多家族开始重新修订族谱。

可是,族谱已经损毁失传,又该从何入手呢?

我说一下我们的做法,题主可以作为参考。

一、采访族中老人,走家串户采集总支世系信息。 二、搜集物证,比如找到老祠堂地址,看是否有石碑。我们就是在老祠堂遗址找到了百年前的纪念石碑,上面的字迹依然可辩。我们将石碑上字拓下来整理出来。

三、家族族谱虽然损毁,但家族各分支有些家里一定还有保留的神主牌位。我们也就是在家族走访中收集到了一些神主牌。

通过这些方式,我们整理出辈分字派,可以和其他地方同姓家族字派进行对比,看能否找到字派一致或者接近的,以找到本支的来源。

经过这些考察走访,我们考证整理出了最初入川的字辈,又重新续订了新的字辈。

族谱的续修,还在进行之中,需要投入大量的人力、物力、财力。

总的说来,需要全族人共同努力,有钱的出钱,有力的出力。

为了追本溯源,弘扬祖宗遗德,继承祖宗传统,我们都应该做好这件事。

我是阆中飞帅,期待你在评论区留言,我们一起探讨。

寻祖藉,求帮助: 湖北吴氏一支和祖藉失去联系,祖藉江西南昌新建县,1890年以前每代人回新建祭祖,此后120多年无人回去,祖谱及祠堂在新建原藉,其中族谱字辈是: 君启继文州,振汉忠国道,诗书礼可传有网友知道上述族谱及地址者,请回复,谢谢!祝您全家幸福!

每届修谱都会印刷出很多套,除非是全部消失了。只要有一套存在,就可以续谱。

无论以前家谱在否,现在主要的是每个家族之间详细记录,有序流传,一旦有追溯的线索,严格考证,同姓之间相互参阅,建立起完整的血缘传承档案。百年之后,尸骨与功业荡然无存,唯一能留下的只有名姓,假如连名字都不能加以记录,我们的一生也就是烟消云散,灰飞烟灭了。

一般都是可以的

只是难度较大

有些可能会难续

但谱有这方面的处理技巧

做总比只遗憾要好百倍,实在没有老谱,就找老人回忆家族世系,并尽量捋清,能到哪代就到哪代,即使有部分错误也没关系,只要别把行辈搞错就是功绩。你现在开始修成家谱,你就是家族的功臣。

盛氏家谱字辈排行汇编 山东嘉祥盛氏字辈:"孝在(吉)允玉(太)宝(传)春振兆洪(红)光"。 山东微山盛氏字辈:"计预云太保作振兆洪光"。 山东临沂盛氏字辈:"清秀开维中"。 山东乐陵盛氏字辈:"茂自福学 " 山东聊城盛氏字辈:"金世泽延长同承基业"。 山东泰安盛氏字辈:"登继富兆宪庆繁祥令德维纯佑"。 山东汶上盛氏字辈:"保邦存正新志安"。 山东平度盛氏字辈:"云树吉永 " 山东青岛盛氏字辈:"起方显瑞祥维复"。 山东临清盛氏字辈:"宗子臣希善玉亭传昭瑞广澄振吉延"。 山东掖县盛氏字辈:"学业继深世乃荣昌纲德佩振可显永光"。 山东盛氏一支字辈:"春振兆红光"。

你是你父母的后代,你是你后代的父母。

你父母的父母的父母早已离去,你后代的后代的后代还未到来。

你是一棵参天大树中的一个节点,这棵树名曰“家谱”。

你如父母的父母的父母一样来到世上,终有一天会如后代的后代的后代一样离去。

你来之前,是否怕过?你走之后,还怕什么?

你应该怕。

生命本就是一个奇迹。

你应该怕自己对不起这个奇迹。

你应该怕,你不及你的父母,你的后代不及你父母的后代,你后代的父母不及你的父母。

你应该怕,先祖之英灵环视之下,你是否对得起先祖,你的生活、你后代的生活是否比先祖的生活好,是否能越来越好。

你应该怕。

不然你无法前进,也无法觉醒。

你不该怕。

你的父母不怕,你的父母的父母的父母也不怕。

你不该怕。

你也不该让自己的后代怕,不该让自己的后代的后代的后代怕。

你不该怕。

生命本就是一个挑战。

你不该怕这种挑战。

你不该让父母觉得自己怕,不该让父母的父母的父母觉得自己怕。

你不该怕。

你不该让自己的后代知道自己怕,不该让自己后代的后代的后代知道自己怕。

你不该怕。

不然你无法奋斗,也无法勇敢。

你是参天大树的一个节点,你唯一,你不可替代,你承上启下。

你只是参天大树的一个节点,如从前的节点一样,终有一天会老化腐朽。

你是参天大树的一个节点,所以,你要让以后的节点更高,更强壮。

你只是参天大树的一个节点,因此,不要妄想自己永远不会脱落。

你是参天大树的一个节点,你应该坚持,至少自己还存在的时候,大树的生长和蔓延不会停息。

你只是参天大树的一个节点,你应该明白,你不在的时候,没有人能像你一样,保证大树的健康与活力。

你就是这样一个节点,新生30岁的节点。

有一天你必然离去,和每个人一样。

到那时,你给后人留下的是什么?

那该是你唯一在乎的、唯一怕的、唯一为之勇敢的。

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;

}

对于一般的家谱树(一般的多叉树)来说,我们可以很清楚的看出层次关系,树的层数表示代数(一共多少代人),树的最后一层表示最后一代人,由于多叉链表法表示的不方便,因此被迫无奈采用孩子兄弟表示法(二叉链表法)

假设我的家谱是这样的:

           

转换成孩子兄弟表示法后是这样的:

           

      我们要做的是:这时我们要找有多少代人,以及最后以一代人出来。

     如果根据第一个图来说找代数就是树的高度,最后一代人就是树的最后一层,二叉链表法中却不如第一个图来的直观,但是只要把握二叉链表法的本质还是很清晰的,根据孩子兄弟表示法的特性,(看二叉链表法的图)结点3的左子树保存的是其孩子,结点3的右子树保存的是其堂兄弟(对照第一个图来看)。假设我们每一个节点都有一个变量用来存储它是第几代的,那么从结点1开始,我们要找结点10是第几代的话,应该这么做:结点1是第一代,然后经过结点5是第二袋,然后看到结点10是第三代。因为第i个结点的左子树是他的孩子,既然是孩子,代数必须+1,而右子树是和第i结点同辈份的(堂兄弟),因此不能加1。本质来说就是往左走代数+1,向右走代数不变。这就是这题目的思路,通过这个方法你就可以知道有多少代人了,且每个节点都有保存了代数信息(用变量存起来了),再次遍历树把最后一代的结点输出即可。清晰了吗?清晰了我就开始写程序。

请问在latex里如何绘制这样的家谱和连线?谢谢!

用 TikZ 可以效果:效果代码:\documentclass{standalone}\usepackage{ctex}\usepackage{pifont} %\ding\usepackage{tikz}\usepackage{c...
点击下载
热门文章
    确认删除?
    回到顶部