(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
目录
图像表示法
双亲表示法
已一组连续的存储单元存储树的结点,每个结点除了数据域data外,还附设一个parent域用以指示其双亲结点的位置


#define MAX_TREE_SIZE 1024
typedef struct
{
int id;
char* name;
}ElementType;
/** 双亲结点 */
typedef struct Pode {
ElementType data; //数据域
int parent; //双亲位置(下标)
}PNode;
/** 双亲表示法的树结构 */
typedef struct {
PNode node[MAX_TREE_SIZE]; //结点数组
int root; //根的位置(下标)
int length; //结点数
}PTree;
/** 初始化空树 */
void InitPTree(PTree* tree) {
tree->root = -1;
tree->length = 0;
}
/** 构造树 */
void CreatePTree(PTree* tree) {
printf("请输入结点个数:");
scanf("%d", &(tree->length));
printf("请输入结点的值及双亲序号:\n");
//根节点为0
tree->root = 0;
for (int i = tree->root; i < tree->length; i++) {
ElementType* elem = (ElementType*)malloc(sizeof(ElementType));
int parentPos;
elem->id = i + 1;
printf("请输入第%d个结点的值:", i + 1);
scanf("%s", elem->name);
tree->node[i].data = *elem;
printf("请输入第%d个结点的双亲位置:", i + 1);
//scanf("%d", &tree->node[i].parent);
scanf("%d", &parentPos);
//为结点赋值
AssignPTree(&(tree->node[i]), parentPos, *elem);
}
tree->node[tree->root].parent = -1; //根结点双亲设置为-1
printf("创建成功:%d\n", tree->length);
for (int i = 0; i < tree->length; i++) {
printf("[%d, %s, %d] ", tree->node[i].data.id, tree->node[i].data.name, tree->node[i].parent);
}
}
/** 为树节点赋值 */
void AssignPTree(PNode* node, int parent, ElementType data) {
node->data = data;
node->parent = parent;
}
孩子表示法
把每个结点的孩子结点排列起来,看成是一个线性表,且以单链表做存储结构,则n个结点有n个孩子链表(叶子的孩子链表为空表),而n个头指针又组成一个线性表

孩子兄弟表示法
如下图所示,将B视为A的长子,则C,D都是B的兄弟,然后将C,D与B相连,形成二叉树的样子,并以此类推,将E视为B的长子,使其与F相连......

优点:它和二叉树的二叉链表表示完全一样,便于将一般的树结构转换为二叉树进行处理。
孩子兄弟表示法构建一棵树,按照长子在左侧、兄弟在右侧的顺序转化为二叉树
转化为
static int id = 0;
typedef struct
{
int id;
char* name;
}ElementType;
/** 孩子兄弟表示法的树结点 */
typedef struct cbNode {
ElementType data; //数据域
struct cbNode* firstChild; //长子结点
struct cbNode* nextSibling; //兄弟结点
}CBNode, * CBTree;
/** 初始化空树 */
void InitCBTree(CBTree* tree) {
*tree = (CBTree)malloc(sizeof(CBNode));
(*tree)->firstChild = NULL;
(*tree)->nextSibling = NULL;
}
/** 构造树 */
void CreateCBTree(CBNode** node) {
char inputName[255];
gets_s(inputName);
//判断用户输入的是否是回车键
if (strcmp(inputName, "\0") == 0) return;
if (*node == NULL) {
*node = (CBNode*)malloc(sizeof(CBNode));
(*node)->firstChild = NULL;
(*node)->nextSibling = NULL;
}
//为结点赋值
(*node)->data.id = ++id;
strcpy((*node)->data.name, inputName);
//分别遍历输入长子结点和兄弟结点
printf("请输入长子结点:");
CreateCBTree(&((*node)->firstChild));
printf("请输入兄弟结点:");
CreateCBTree(&((*node)->nextSibling));
}
括号表示法

遍历表示法
树的前序、后序遍历 (http://t.csdn.cn/V9gqW)


1885

被折叠的 条评论
为什么被折叠?



