// FamilyMap_BTree.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#define fileName "familyMap.dat"
//定义节点最大个数
#define MaxNode 20
//节点数据类型
typedef char ElemType;
//二叉树节点类型(节点类型)
typedef struct btnode{
ElemType data;//家谱图中人员编号
btnode * lchild;//成员的配偶指针
btnode * rchild;//成员的子女及子女的兄弟指针
}BtNode;
typedef BtNode *BTree;//定义BtNode *类型为BTree
//二叉树栈
typedef struct{
BtNode * stack[MaxNode];//栈区
int top;//栈顶指针
}BTreeStack;
typedef struct{
BtNode * pNode;
int height;
}BtNodewithHeight;
//二叉树队列
typedef struct{
BtNodewithHeight queue[MaxNode];//队列数据区
int front;//队列头指针
int rear;//队列尾指针
}BTreeQueue;
//从文件中读取系谱图(以括号表示法储存)
bool ReadfromFile(char *&s){
FILE *fp = NULL;
fopen_s(&fp,fileName,"rb");
int size=0;
if (fp == NULL)
return false;
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
s = (char *)malloc(sizeof(size+1));//在这里分配了内存空间,在外面使用,最后释放
*(s + size) = '\0';
fread(s,size,1,fp);
fclose(fp);
return true;
}
//从括号表述法创建二叉树(使用栈进行实现)
bool CreateBTreefromBracketNotation(BTree &r, char * btStr){
BTreeStack bts;
bts.top = -1;//初始化栈
int i = 0, k = 0;//i用于保存串的偏移量,k用于标记处理栈顶的左指针还是右指针
char ch;//ch用于保存括号表示法串的字符
BtNode * temp = NULL;//temp用于保存待处理的节点
while ((ch = *(btStr + i))