用二叉树实现家谱运算
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篇《我的姥爷》作文,供大家参考。
我的姥爷作文1
他,皮肤黝黑,头发花白,脾气火爆,心地善良,严以律己,吃苦耐劳,知识渊博,心灵手巧。他的辈分比我大两辈,我的年龄比她小57岁。他管我叫“乖乖”,我称他为“姥爷”。他是我最老的朋友,我是他的忘年交。
相同的爱好,相同的习惯,相同的口味,相同的审美使我们有了更多的共同语言;语言的交流加深了彼此的了解;了解的深入缩小了心灵之间的距离;距离的靠近填平了深邃的代沟;代沟的消失使我们成了莫逆之交的好朋友。在文化知识的学习上,他为我答疑解惑;在电脑技术方面,我为他讲解演示。互帮互学增进了我们的友谊,共同的生活使我们心灵相通。姥爷是一个关心时政,疾恶如仇的人。
虽身为一介草民,却忧国忧民。每当看到官员贪污腐败,欺压百姓,或者不良商家见利忘义,坑蒙拐骗的新闻时他总是表现的慷慨激昂,义愤填膺。只见他:眼睛瞪大了,嗓门提高了,脖筋变粗了,脸颊变红了。狠批痛斥,活生生宛如一个当代愤青。
姥爷是一个兴趣广泛,热爱生活的人。经过多年的“经营”,他把我们家变成了一个宁静,舒适,温馨,浪漫,处处洋溢着浓浓的生活情趣和充满田园气息的“小小世外桃源”。举目环视:藤蔓屋顶爬,金鱼缸中游,花儿盆中开,绿叶随风摆。屋内窗明几亮,墙上书画辉映,架上书籍成行,房中乐声悠扬。老爷是一个知识渊博,心灵手巧的人。教师,厨师,工程师;木工,电工,修理工;身兼数职,样样精通,真可称得上是一位名副其实的“杂家”。家中的水,电,气,卫出现问题,他一看就懂,一学就会,一修就好。这其中当然包括修好了我的不少玩具。姥爷的厨艺在我家首屈一指,几十年的实践使得他技艺精湛,炉火纯青。
逢年过节更是他大展身手的好机会:六凉六热称之六六大顺;八凉八热叫做发了又发;十凉十热起名十全十美。姥爷是一个生活考究,追求时尚的人。良好的教育和广阔的视野造就了他独特的审美能力。你绝对不会想到一个内穿粉红色的衬衣,外套一件“皮尔。卡丹”牌蓝碎格呢西服,脚蹬“梦特娇”镂空雕花牛皮鞋,嘴里品着“泽合。怡保”白咖啡“,手拿”苹果“手机上网冲浪的人会是一个70岁的老头。而他就是我的姥爷,一个追求时尚,紧跟潮流的人。
这就我的姥爷:一个淡泊名利,追求理想的正人;一个聪明能干,默默奉献的好人,一个乐观开朗,享受生活的老人,一个思想解放,破旧立新的潮人。
我的姥爷作文2
我的姥爷快70了,可还是一个闲不住的人,他高高的、瘦瘦的,常带笑容的脸上有一双慈祥的眼睛。他的脚有点跛,走起路来沉甸甸的,我一听到楼道里有“咚咚”的声音,就打开门,准是他。
姥爷的爱好很多,打门球、上网、跳舞、放风筝,他都喜欢。姥爷最爱的就是打门球,只要不下雨每天铁打不动要去打门球,总给我说:“生命在于运动”。不仅如此,平时没事的时候,他就画打门球的图纸,自己想不出来,就让我也来帮他想。我姥爷画图时那叫一个全神贯注,一画就是几个小时。真叫我自愧不如。
我姥爷最近还迷上了上网,他见他们打门球的人都会上网,非常羡慕,天天让我教他电脑,如果我不在家,他就找对门的哥哥教他。他一边学,一边忘,一边再不耻下问,我都害怕他问了。嗨,真没办法!不过在他的努力下,他的网上农场越来越兴旺了。每当他偷起菜时不管你怎么叫他都不行,总说:“马上就偷完了,就等一会。”真是一个老顽童。姥爷很随着我,依着我,我喜欢在家捣鼓一些小发明、小创造之类,姥爷总是陪着我,同我一起做,家里常常被弄得乱七八糟,惹来姥姥一阵抱怨,而姥爷却总是乐呵呵的说:“莫生气、莫生气,马上收拾,马上收拾。”
这就是我的姥爷,一个对我非常好的老顽童。
我的姥爷作文3
俗话说:“人过七十古来稀”,我的姥爷作文。我的姥爷今年都已经七十四岁了,身体却还是硬朗得很,像年轻人一样充满活力。姥爷身材魁梧,高达一米八四,背稍微有点儿驼。古铜色的脸庞上透着刚毅,稀疏的头发已经花白。有的地方已经露出了头皮,这可是姥爷经受风吹雨打的见证啊。
听妈妈说,姥爷家祖代经商,过去姥爷的爷爷卖年画的钱都要雇人来数,才数得清。到姥爷这一代,正好赶上改革开放,姥爷骑着他那辆力帆摩托车天天赶集卖小百货。五年下来。生意越做越大。来到集市上,姥爷麻利地卸下货物,一字摆开,货物摆得又整齐又条理;姥爷然后到餐点上匆匆吃些早餐,喝几口白酒,。顾客越来越多,一天的生意开始了。姥爷为人心地善良,货物质量好价格低,赢得了许多顾客的一致好评。
因此,有许多回头客到姥爷这儿买货。他们常常把赶集的货物寄放在姥爷的货摊上,这儿成了他们赶集的中转站;瞧,又有一群爷爷、奶奶、大姨、大叔聚拢到姥爷的货摊上,他们围着姥爷问长问短,姥爷边跟他们聊天,边应付着买货的顾客。赶集使得姥爷上了瘾,只要一天不赶集,姥爷就坐立不安。赶集还让姥爷还让认识了许多老朋友、忘年交。姥爷的生意做得红红活火,这不,新年伊始姥爷又买了一辆较大型、装载量较大的新车。
太阳渐升渐高,姥爷骑着新车,迎着和煦的春风,一如既往地做着百货生意。
以上就是关于我的姥爷作文的写作思路和范文了,大家可以根据自己生活中和姥爷相处的点点滴滴进行写作,平时多注意观察,相信可以有很多的内容可以进行写作的~
我们这边是说,死后尸体要放三天,然后火化后直接下葬。
不过因为现在很多都没法把尸体放这么长时间了,所以可以先火化,之后骨灰在家放三天
布置的话要有贡品(每样四个)有蜡烛,香不能断……
大概就这样吧……
不过其实这些都不过是个讲头,现在也不是很讲究这些了,毕竟人已经去了,心意才是最重要的……
最近家里也有老人去世,跟着办事的时候知道的这些,LZ也节哀吧
用二叉树实现家谱运算
本文2023-10-04 00:46:04发表“资讯”栏目。
本文链接:https://www.lezaizhuan.com/article/168844.html