(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)目录
图像表示法
双亲表示法
已一组连续的存储单元存储树的结点,每个结点除了数据域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)