数据结构中树的四种表示方法详解:树形、嵌套集合、嵌套括号和凹入表示法
创作时间:
作者:
@小白创作中心
数据结构中树的四种表示方法详解:树形、嵌套集合、嵌套括号和凹入表示法
引用
1
来源
1.
https://cloud.tencent.com/developer/article/2440405
本文详细介绍了数据结构中树的四种表示方法:树形表示法、嵌套集合表示法、嵌套括号表示法和凹入表示法。通过图文结合的方式,深入浅出地讲解了每种表示方法的原理,并提供了相应的C语言代码实现,适合对数据结构有一定了解的读者。
树的基本概念
树的定义
- 一棵树是结点的有限集合T:
- 若T非空,则:
- 有一个特别标出的结点,称作该树的根,记为root(T);
- 其余结点分成若干个不相交的非空集合T1, T2, …, Tm (m>0),其中T1, T2, …, Tm又都是树,称作root(T)的子树。
- T 空时为空树,记作root(T)=NULL。
森林的定义
一个森林是0棵或多棵不相交(非空)树的集合,通常是一个有序的集合。换句话说,森林由多个树组成,这些树之间没有交集,且可以按照一定的次序排列。在森林中,每棵树都是独立的,具有根节点和子树,树与树之间没有直接的连接关系。
森林是树的扩展概念,它是由多个树组成的集合。在计算机科学中,森林也被广泛应用于数据结构和算法设计中,特别是在图论和网络分析等领域。
树的术语
- 父亲(parent)、儿子(child)、兄弟(sibling)、后裔(descendant)、祖先(ancestor)
- 度(degree)、叶子节点(leaf node)、分支节点(internal node)
- 结点的层数
- 路径、路径长度、结点的深度、树的深度
树的表示
- 树形表示法
树形表示法是一种图形化的表示方法,使用节点和边来表示树的结构。每个节点代表树中的一个元素,而边表示节点之间的关系。这种表示方法可以直观地展示树的层次结构和节点之间的连接关系。
- 嵌套集合表示法
嵌套集合表示法使用集合的嵌套结构来表示树:每个集合代表一个节点,而集合中的元素表示该节点的子节点。通过嵌套的方式,可以表示出树的层次结构。
tree = {
'value': 'A',
'children': [
{
'value': 'B',
'children': []
},
{
'value': 'C',
'children': [
{
'value': 'D',
'children': []
}
]
}
]
}
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int value;
struct TreeNode** children;
int numChildren;
};
struct TreeNode* createTreeNode(int value, int numChildren) {
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->value = value;
node->numChildren = numChildren;
node->children = (struct TreeNode**)malloc(numChildren * sizeof(struct TreeNode*));
for (int i = 0; i < numChildren; i++) {
node->children[i] = NULL;
}
return node;
}
int main() {
struct TreeNode* root = createTreeNode(1, 2);
struct TreeNode* node1 = createTreeNode(2, 0);
struct TreeNode* node2 = createTreeNode(3, 1);
struct TreeNode* node3 = createTreeNode(4, 0);
root->children[0] = node1;
root->children[1] = node2;
node2->children[0] = node3;
// 其他操作...
return 0;
}
- 嵌套括号表示法
嵌套括号表示法使用括号来表示树的结构:每对括号代表一个节点,而括号内的内容表示该节点的子节点。通过嵌套括号的方式,可以清晰地表示树的层次结构和节点之间的关系。
tree_str = '((A (B C)) D)'
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int value;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* createTreeNode(int value) {
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->value = value;
node->left = NULL;
node->right = NULL;
return node;
}
// 根据嵌套括号表示法构建树
struct TreeNode* buildTreeFromParenthesis(char* treeStr, int* index) {
struct TreeNode* node = NULL;
int value = 0;
int sign = 1;
while (treeStr[*index] != '\0') {
char c = treeStr[*index];
(*index)++;
if (c == '(') {
if (node == NULL) {
node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->left = NULL;
node->right = NULL;
}
node->left = buildTreeFromParenthesis(treeStr, index);
} else if (c == ')') {
return node;
} else if (c == '-') {
sign = -1;
} else if (c >= '0' && c <= '9') {
value = value * 10 + (c - '0');
} else if (c == ' ') {
value *= sign;
node->value = value;
value = 0;
sign = 1;
}
}
return node;
}
int main() {
char* treeStr = "(1 (2 (4) (5)) (3 (6)))";
int index = 0;
struct TreeNode* root = buildTreeFromParenthesis(treeStr, &index);
// 其他操作...
return 0;
}
- 凹入表示法
凹入表示法使用缩进来表示树的结构:每个节点都在上一级节点的下方,并且比上一级节点缩进一定的距离。通过缩进的方式,可以清晰地展示树的层次结构和节点之间的嵌套关系。
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int value;
struct TreeNode* firstChild;
struct TreeNode* nextSibling;
};
struct TreeNode* createTreeNode(int value) {
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->value = value;
node->firstChild = NULL;
node->nextSibling = NULL;
return node;
}
struct TreeNode* buildTreeFromIndented(char* treeStr, int* index, int level) {
struct TreeNode* node = NULL;
while (treeStr[*index] != '\0') {
char c = treeStr[*index];
(*index)++;
if (c == '\n') {
continue;
}
if (c == ' ') {
continue;
}
if (c == '-') {
level++;
continue;
}
int value = c - '0';
if (node == NULL) {
node = createTreeNode(value);
} else {
struct TreeNode* child = createTreeNode(value);
if (node->firstChild == NULL) {
node->firstChild = child;
} else {
struct TreeNode* sibling = node->firstChild;
while (sibling->nextSibling != NULL) {
sibling = sibling->nextSibling;
}
sibling->nextSibling = child;
}
}
int nextChar = treeStr[*index];
if (nextChar == '\n') {
level--;
} else if (nextChar == '-') {
continue;
} else {
break;
}
}
return node;
}
int main() {
char* treeStr = "1\n-2\n--4\n--5\n-3\n--6\n";
int index = 0;
struct TreeNode* root = buildTreeFromIndented(treeStr, &index, 0);
// 其他操作...
return 0;
}
热门推荐
Thunderbolt™ 和 USB-C 有哪些相同点和不同之处
什么是 Thunderbolt?
量比和委比分别是什么意思?它们在股票交易中的作用有何不同?
治癌27年,50岁肿瘤专家死于癌症!他的临终遗言,值得所有人反思!
独行者的心灵疗愈地:国内最适合一个人散心的6座城市
深度拆解《伤寒论》柴胡桂枝干姜汤:从少阳太阴并病到现代疑难病通治的千年密码
项目经理如何组队:从目标设定到团队建设的全方位指南
合伙人查账一般怎么查
抽筋补充什么维生素?6种营养素助你缓解抽筋困扰
根管治疗几个月后牙疼正常吗?不正常!建议及时就医检查下
实验动物伦理审查指南:确保科研道德与合规
动物试验需要遵循的原则都有哪些?
“抗癌成功第一人”凌志军:从癌症晚期到肿瘤消失,他做了什么?
银行的理财产品投资收益与投资心理因素的关系?
增加43万人!2025年高校毕业生人数曝光,毕业生六大选择详析
《审判:小说主人公的人物分析》
法甲、英冠与荷甲精彩对决分析:马赛、沃特福德与乌德勒支的现状
积分清零、可兑换商品……这种短信是真的吗?揭秘4类常见骗局
城市未来引擎:产业园区的革新之路与全球智慧启示
雅思口语四大评分标准及得分要素
新手买房指南:从预算到合同签订的全方位购房攻略
甘草金桔膏
BrainCo智能假肢助力少女与郎朗合奏,脑机接口技术实现新突破
儿童青少年心理行为训练基地:认知知觉与言语能力评估方法
临时工辞职要提前多久
共建多元化AI数据生态:微软携手哈佛、OpenAI等组织,消除AI偏见
1945年冲绳岛战役:美日双方的终极对决
PTSD的治疗方法
来自一位创伤治疗师的5个建议,帮助治愈创伤后应激障碍(PTSD)
开源项目中如何优化软件的部署流程