有些同学可能会在数据结构的学习中产生“为什么树结构的表示法会出现不同?”,”他们有什么区别吗?”等疑问。
其实产生这些疑问是很正常的,因为这通常代表你是在主观能动的学习,以前我也产生过类似的问题,我的老师给给我的回答是“在计算机领域中通常是只有'SOTA',而没有'Perfect'的”。即我们只有在面对单独一个问题时有目前的最优解法,而不存在适用于解决所有问题的“完美解法”。也正因如此,在实际情况中当工作人员会发现或者说创造适当的方法来解决问题。
下面我会分享一些我在学习数据结构时的笔记供大家参考。
笔记整理:
双亲链表表示法:
定义:每个节点包含指向其父节点的指针和数据。
优势: 查找父节点方便,适用于需要频繁查找父节点的情况。
示例应用:
1. 家谱系统:方便查找祖先。
2. 文件系统:便于定位文件或文件夹的父目录。
孩子链表表示法:
定义:每个节点包含指向其第一个孩子节点的指针和数据。
优势:查找孩子节点方便,存储上更为紧凑。
示例应用:
1. 组织结构:方便查找员工的下属。
2. HTML文档对象模型(DOM):便于遍历和操作DOM树。
家谱案例:
#include <stdio.h>
struct TreeNode {
int data;
struct TreeNode* parent;
};
// 创建一个简单的家谱树
int main() {
struct TreeNode grandparent = {1, NULL};
struct TreeNode parent = {2, &grandparent};
struct TreeNode child = {3, &parent};
// 访问父节点
printf("%d\n", child.parent->data); // 输出: 2
return 0;
}
简单的公司组织结构案例:
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int data;
struct TreeNode** children;
int child_count;
};
// 创建一个简单的组织结构树
int main() {
struct TreeNode ceo = {1, NULL, 0};
struct TreeNode cto = {2, NULL, 0};
struct TreeNode cfo = {3, NULL, 0};
// 分配内存给孩子节点
ceo.children = (struct TreeNode**)malloc(2 * sizeof(struct TreeNode*));
// 添加孩子节点
ceo.children[0] = &cto;
ceo.children[1] = &cfo;
ceo.child_count = 2;
// 访问孩子节点
printf("%d\n", ceo.children[0]->data); // 输出: 2
// 释放内存
free(ceo.children);
return 0;
}
学习笔记,如有错误请斧正。