数据结构,二叉树遍历,孩子兄弟表示法,算法设计题
对于一般的家谱树(一般的多叉树)来说,我们可以很清楚的看出层次关系,树的层数表示代数(一共多少代人),树的最后一层表示最后一代人,由于多叉链表法表示的不方便,因此被迫无奈采用孩子兄弟表示法(二叉链表法)
假设我的家谱是这样的:
转换成孩子兄弟表示法后是这样的:
我们要做的是:这时我们要找有多少代人,以及最后以一代人出来。
如果根据第一个图来说找代数就是树的高度,最后一代人就是树的最后一层,二叉链表法中却不如第一个图来的直观,但是只要把握二叉链表法的本质还是很清晰的,根据孩子兄弟表示法的特性,(看二叉链表法的图)结点3的左子树保存的是其孩子,结点3的右子树保存的是其堂兄弟(对照第一个图来看)。假设我们每一个节点都有一个变量用来存储它是第几代的,那么从结点1开始,我们要找结点10是第几代的话,应该这么做:结点1是第一代,然后经过结点5是第二袋,然后看到结点10是第三代。因为第i个结点的左子树是他的孩子,既然是孩子,代数必须+1,而右子树是和第i结点同辈份的(堂兄弟),因此不能加1。本质来说就是往左走代数+1,向右走代数不变。这就是这题目的思路,通过这个方法你就可以知道有多少代人了,且每个节点都有保存了代数信息(用变量存起来了),再次遍历树把最后一代的结点输出即可。清晰了吗?清晰了我就开始写程序。
家谱的主要内容:姓氏源流和世系表。
一、姓氏源流
中国姓氏在经过历史不断演变,如:战乱,迁移,改朝换代,以及避讳改姓、避难改姓、复姓改为单姓等,姓氏变得更为复杂,其真正的出处、源头就更需要详细考证了。一些史学专家认为,历史上的王朝更替、社会动荡导致了家谱的断裂残缺,很多族谱都由后人凭想象臆造。
封建时代,许多姓氏为了抬高自己的门第和郡望,习惯于与名人扯上关系,或硬追溯到某皇帝作自己的祖先,这影响了血缘的纯正性和确实性。重视传统的中华民族,有不少家族在重修宗谱,由于南北各地的语言、风俗、长相等均不同,世系联系在一起,其纸谱真实性值得推敲。
二、世系表
作为家谱中最重要的内容,“世系表”,简而言之,就是说明一个家族成员,如:父子、兄弟间的相互关系,写清楚祖先后代每一个家族成员名字的图表。它有四种基本的记述格式:欧式、苏式、宝塔式和牒记式。
(1)欧式:又称横行体,是北宋文学家欧阳修创立的。欧式的特点是:世代分格,由右向左横行,五世一表,用起来很方便。欧式中,每个世代人名左侧都有一段生平记述,介绍该人的字、号、功名、官爵、生辰年月日、配偶、葬地、功绩等。
(2)苏式:又称垂珠体,是北宋文学家苏洵创立的。苏式世系表的特点是:世代直行下垂,世代间无横线连接,全部用竖线串连,图表格式也是由右向左排列的,主要是强调宗法关系。
(3)宝塔式:顾名思义,就是将世代人名象宝塔一样,由上向下排列。宝塔式采用横竖线连接法,竖线永远处在横线的中间,这对人多的大家族来说,因人名不可能排在同一页纸上,兄弟之间长幼关系不清,会为写谱、看谱带来很多不便。
(4)牒记式:不用横竖线连接世代人名间的关系,而是纯用文字来表述这种关系。每个人名下都有一个相关的简介,如:字、号、功名、官爵、生辰年月日、葬地、功绩等。牒记式的世系形式固定,次序分明,比较节约纸张。
扩展资料
家谱是一个家族的历史记载,通过家谱,能够了解当时的历史面貌、时代精神、社会风尚,了解在那个历史背景下人们的生产、生活情况。相传它是由正史中的帝王本纪及王侯列传、年表等演变而来。家谱是和正史、方志一样重要的历史典籍,是史学的重要组成部分之一。
中国的家谱一般都有家规族训,对于规范人生和教育子弟有着积极的意义。家谱,亦称族谱、宗谱、家乘、通谱、统谱、世谱、支谱、房谱等等,名称各异,其内涵是同一的,只是外延有所区别而已,如今一般统称家谱或族谱。家谱是系统记述某一同宗共祖的血缘集团世系人物或兼及其他方面情况的历史图籍。而姓氏是“某一同宗共祖血缘集团”的标识符号,家谱、族谱就是记录某一姓氏家族成员间的血缘关系的图册。
-家谱 (人文资料)
古代文学论文题目
1 《诗经》分类研究(情诗、思妇诗、离别诗等)
2 先秦诸子文研究(《论语》、《庄子》、《孟子》、先秦寓言等)
3 屈原与楚辞研究(生平、悲剧成因、作品辨伪、思想与艺术等)
4 中国文学批评史专家专著专论研究
5 亡国之音哀以思——论李煜词
6 柳永词的雅和俗
7 论柳永对苏轼词的影响
8 苏轼的人品与词风
9 李清照前后期词在情感表达上的不同
10 苏轼、辛弃疾豪放词风的比较
11 论秦观词的艺术特色
12 论黄庭坚的瘦硬诗风
13 《三国演义》和历史文学创作问题
14 《水浒传》主题辨析
15 汤显祖戏曲观的研究
16 《聊斋志异》爱情题材论
17 《红楼梦》主要人物形象论
18 简论中唐多情传奇
19 从李贺诗看其“鬼才”之名
20 简论李商隐的咏史诗
21 李商隐的“无题诗”的艺术特色
22 简论中唐多情传奇
23 李煜词评价之我见
24 试论李清照词的艺术特色
25 豪放大师苏轼的婉约词
26 论关汉卿喜剧之“双璧”《救风尘》与《望江亭》
27 古典长篇小说名著(任选一部)中的女性艺术形象试论
28 《三言》中爱情作品的反封建倾向
29 《红楼梦》中宝、黛、钗的爱情婚姻悲剧试论
30 《红楼梦》中“金陵十二钗”的女性悲剧
31 谈影视剧中历史题材作品的时代精神与当代意识
32 论《三国演义》塑造诸葛亮的艺术经验
33 论《三国演义》战争描写的艺术特色
34 论《西游记》的孙悟空形象
35 论《牡丹亭》的杜丽娘形象
36 论“三言二拍”表现的市民生活特色
37 论《桃花扇》的李香君形象
38 论《桃花扇》的结构艺术
39 论《儒林外史》对八股科举制的批判
40 论《儒林外史》的讽刺艺术
41 论论李汝珍的《镜花缘》
42 论二晏词
43 论苏轼的散文特色
44 论陆游晚年的思想和诗歌创作
45 从林逋的咏梅诗到姜夔咏梅诗
46 辛弃疾词与南宋理学的关系
47 论元杂剧中的包公形象
48 论《西厢记》中张生的形象
49 论元杂剧中的李逵形象
50 贾谊论
51 《史记》人物传记所体现审美情趣
52 《史记》人物传记中人物形象分析
53 汉乐府诗分析
54 陶渊明的人格和诗风
55 南北朝乐府民歌艺术风格比较
56 正始文学与建安文学异同论
57 论曹植诗歌的整体风格
58 魏晋隐士与魏晋文学
59 《世说新语》刻画人物
60 魏晋南北朝小说在中国小说史上的地位
61 陶渊明与谢灵运诗歌比较
62 《西厢记》的传播
63 元杂剧的题目正名
64 元刊本杂剧中的角色问题
65 《窦娥冤》的悲剧特征
66 三国演义的成书问题
67 《水浒传》中的女性形象
68 牡丹亭》的传播
69 《红楼梦》中改名问题
70 石头传说与贾宝玉形象
71 石头传说与孙悟空形象
72 传奇戏的文人化问题
73 戏曲的案头化研究
74 商人形象在明清小说的变化及意义
75 《桃花扇》中的女性问题
76 李白诗中的仙、侠精神。
77 论辛词的英雄情节
78 论杜诗沉郁顿挫的风格特色
79 论辛弃疾的“以文为词”
80 论韩愈的“以文为诗”。
81 “清空骚雅”、“幽韵冷香”的白石词。
82 关于白居易《新乐府的评价
83 关汉卿杂剧中的女性形象
84 韩愈散文的艺术风格
85 元散曲的艺术风格
86 柳宗元的寓言创作
87 《三国演义》的艺术成就
88 唐传奇中的女性形象
89 《水浒传》的艺术成就
90 论杜牧的七言绝句
91 论归有光的散文
92 论李商隐的无题诗
93 《牡丹亭》的艺术成就
94 西蜀词与南唐词之比较
95 论《西游记》的诙谐风格
96 欧阳修词的艺术风格
97 《金瓶梅》人物论
98论纳兰性德词
99 欧阳修散文的情韵美
100 王安石后期的诗歌
/实验14—2 设计一个程序,采用二叉树表示一个家谱关系。要求程序具有如下功能:
(1) 文件操作功能:记录输入、记录输出,清除全部文件记录和将家谱记录存盘。
(2) 家谱操作功能:用括号表示法输出家谱二叉树,查找某人所有的儿子,查找某人所有的祖先。/
#include<iostreamh>
#include<stdlibh>
#include<stdioh>
#include<stringh>
typedef struct Node
{
int degree;//人员所在代数
char data;//人员标志
struct Node lchild;//data的孩子
struct Node rchild;//data的兄弟
}BTNode;
#define max 100
int choose;
char X;
void CreatBTNode(BTNode b,char str);//创建记录
BTNode SearchX(BTNode b,char X);//查找记录
void InputBTNode(BTNode b,char str);//1记录输入
void OutputBTNode(BTNode b,char str);//2记录输出
void Store(BTNode b,char str);//3家谱记录存盘
void DispTree(BTNode b);//4用括号法输出家谱
void SearchXSon(BTNode b,char X);//5查找某人的儿子
void SearchXAncestor(BTNode b,char X);//6查找某人的祖先
void Distory(BTNode b,char str);//7清除全部文件记录
int main()
{BTNode b=NULL;
char str=(char)malloc(maxsizeof(char));
str[0]='\0';
cout<<"--------------------------------------------------------------------"<<endl;
cout<<"0退出"<<endl;
cout<<"1记录输入:\t"<<endl;
cout<<"2记录输出:\t"<<endl;
cout<<"3家谱记录存盘:\t"<<endl;
cout<<"4用括号法输出家谱:\t"<<endl;
cout<<"5查找某人的儿子:\t"<<endl;
cout<<"6查找某人的祖先:\t"<<endl;
cout<<"7清除全部文件记录:\n"<<endl;
cout<<"-------------------------------------------------------------------"<<endl;
cout<<"Please choose the operation you want to do "<<endl;
cout<<"choose=";
cin>>choose;
while(choose)
{switch(choose)
{
case 1:
InputBTNode(&b,str);break;
case 2:
OutputBTNode(&b,str);break;
case 3:
Store(b,str);
printf("文件已经保存!");
break;
case 4:
DispTree(b); break;
case 5:
printf("请输入需要查找儿子的结点:");
cin>>X;
SearchXSon(b,X);
break;
case 6:
printf("请输入需要查找祖先的结点:\n");
cin>>X;
BTNode p;
p=SearchX(b,X);
if(p!=NULL)
SearchXAncestor(b,X);
else
printf("该结点不存在!");
break;
case 7:
Distory(&b,str);
printf("文件记录已经清除!");
break;
default:
cout<<endl<<"Invalid input,input again";
}
cout<<endl<<"please choose again:"<<endl;
cout<<"the choose =";
cin>>choose;
}
return 0;
}
void CreatBTNode(BTNode b,char str) //创建树
{
BTNode S[max],p=NULL;
int top=-1,tag,j=0,d=0;
char ch;
b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':
d++;
top++;
S[top]=p;
tag=1;break;
case ')':
top--;break;
case ',':
d--;
tag=2;break;
default:
p=(BTNode )malloc(sizeof(BTNode));
p->degree=d;
p->data=ch;
p->lchild=NULL;
p->rchild=NULL;
if((b)==NULL)(b)=p;
else
{
switch(tag)
{
case 1: S[top]->lchild=p;break;
case 2: S[top]->rchild=p;break;
}
}
}
ch=str[++j];
}
}
void InputBTNode(BTNode b,char str)//记录输入
{
do
{
printf("请输入需要输入的记录:\n");
gets(str);
if(str[0]=='\0')
printf("输入的记录为空,请再次输入:\n");
}while(str[0]=='\0');
CreatBTNode(b,str);
printf("记录创建成功!");
}
void OutputBTNode(BTNode b,char str)//从文件中读出记录
{
FILE fp;
if((fp=fopen("wangljtxt","r"))==NULL)
{
printf("不存在记录文件,要建立吗\n建立请输入Y,否则按其他键:");
if(getchar()=='Y')
{
fp=fopen("wangljtxt","w+");
printf("记录文件“wangljtxt”已建立\n");
}
else
exit(1);
}
else
{
if(!feof(fp))
fscanf(fp,"%s",str);
fclose(fp);
CreatBTNode(b,str);
printf("文件中记录已输出\n");
}
}
void Store(BTNode b,char str)//储存全部的结点记录
{
BTNode p;
p=b;
FILE fp;
fp=fopen("wangljtxt","w+");
if(fp==NULL)
{
printf("文件打开失败!");
return;
}
else
{
if(p!=NULL)
{
fprintf(fp,"%s",str);
fclose(fp);
}
}
}
void DispTree(BTNode b)//用括号法输出家谱记录
{
if(b!=NULL)
{printf("%c",b->data);
if(b->lchild!=NULL||b->rchild!=NULL)
{printf("(");
DispTree(b->lchild);
if(b->rchild!=NULL)
{printf(",");
DispTree(b->rchild);
}
printf(")");
}
}
else
printf("\0");
}
BTNode SearchX(BTNode b,char X)//查找结点X
{BTNode p;
if(b==NULL) return NULL;
else if(b->data==X) return b;
else
{
p=SearchX(b->lchild,X);
if(p!=NULL) return p;
else
{
return SearchX(b->rchild,X);
}
}
}
void SearchXSon(BTNode b,char X)//查找结点X的所有儿子
{
BTNode p,q;
p=SearchX(b,X); //找到节点X
if(p!=NULL)
{
p=p->lchild;
if(p==NULL) //X没有孩子
printf("节点%c没有儿子!",X);
else
{
printf("节点%c的所有儿子为:",X);
if(p!=NULL)
printf("%c ",p->data);
q=p->rchild;
while(q)
{
printf("%c ",q->data);
q=q->rchild;
}
}
}
else
printf("该结点不存在!");
}
void TraverseBT(BTNode b,int d)//遍历家谱
{
if(b!=NULL)
if(b->degree<d)
{
printf("%c ",b->data);
if(b->lchild!=NULL)
TraverseBT(b->lchild,d);
if(b->rchild!=NULL)
TraverseBT(b->rchild,d);
}
}
void SearchXAncestor(BTNode b,char X)//查找结点X的所有祖先
{
if(b==NULL)
{
printf("这是一棵空树!");
return ;
}
BTNode p=SearchX(b,X);
if(p->degree==0)
{
printf("X为根节点或其兄弟,没有祖先!");
return;
}
printf("%c结点的祖先有:",X);
TraverseBT(b,p->degree);
}
void Distory(BTNode b,char str)//清除全部的记录
{
(b)=NULL;
FILE fp;
fp=fopen("wangljtxt","w");
if(fp==NULL)
{
printf("打开文件失败!");
exit(1);
}
str="";
fclose(fp);
}
你懂的,同道中人!
数据结构,二叉树遍历,孩子兄弟表示法,算法设计题
本文2023-09-29 23:23:43发表“资讯”栏目。
本文链接:https://www.lezaizhuan.com/article/137545.html