本文共 2122 字,大约阅读时间需要 7 分钟。
树的表示法
树是数据结构中的一种非常重要的概念,它可以用来描述具有层次关系的数据集合。树的表示法主要有双亲表示法、孩子表示法和兄弟表示法等不同形式。
图像的表示法
在树的表示法中,最常用的两种方式是双亲表示法和孩子表示法。
双亲表示法:每个结点都有一个指向其父结点的指针。
孩子表示法:每个结点都有一个指向其长子结点的指针。
孩子兄弟表示法:每个结点都有一个指向其长子结点的指针,同时每个结点也包含一个指向其兄弟结点的指针。
括号表示法
括号表示法是一种常用的树的表示方法。它通过递归的方式来描述树的结构。例如:
树的括号表示法可以通过递归函数来实现,每个结点的括号表示法包含其长子结点的括号表示法和兄弟结点的括号表示法。
遍历表示法
树的遍历是指按照一定的规则访问树中的每一个结点。常见的树遍历方式包括前序遍历、中序遍历、后序遍历和层序遍历。
双亲表示法
双亲表示法是一种树的表示方式。它通过每个结点存储指向其父结点的指针来实现。这种表示方式简单直观,但在处理复杂树结构时可能不够高效。
孩子表示法
孩子表示法是一种树的表示方式。它通过每个结点存储指向其长子结点的指针来实现。这种表示方式可以很好地反映树的结构特点。
孩子兄弟表示法
孩子兄弟表示法是一种树的表示方式。它通过每个结点存储指向其长子结点的指针,同时每个结点也包含一个指向其兄弟结点的指针。这种表示方式可以很好地支持树的遍历和操作。
树结点
树的结点通常由结构体或类来表示。以下是一个典型的树结点结构定义:
typedef struct CSNode{ Element data; //结点数据域 struct CSNode * friendChild; //长子结点 struct CSNode * nextSibling; //兄弟结点}CSNode, * CSTree;
树和二叉树的相互转换
树和二叉树之间可以通过孩子兄弟表示法进行相互转换。这种转换方式可以将一般的树结构转化为二叉树,从而方便进行二叉树的操作。以下是一个示意图:
左图是原树;右图是转化之后的树。
孩子兄弟表示法基本操作
孩子兄弟表示法是一种高效的树表示方式。以下是孩子兄弟树的基本操作:
#define NAME_SIZE 255typedef struct{ int id; char name[NAME_SIZE];}ElementType;typedef struct cbNode{ ElementType data; //数据域 struct cbNode * firstChild; //长子结点 struct cbNode * nextSibling; //兄弟结点}CBNode, * CBTree; // *CBTree 二级指针void InitCBTree(CBTree * tree){ *tree = (CBTree)malloc(sizeof(CBNode)); (*tree)->firstChild = NULL; (*tree)->nextSibling = NULL;}static int id = 0;void CreateCBTree(CBNode ** node){ char inputName[255]; gets(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);}void PreOrderCBTree(CBNode * node){ if(node != NULL){ printf "[%d, %s] ", node->data.id, node->data.name); CBNode * p = node->firstChild; PreOrderCBTree(p); while(p){ p = p->nextSibling; PreOrderCBTree(p); } }}
转载地址:http://frgmz.baihongyu.com/