目录
树的孩子表示法存储 v.s. 图的邻接表存储 v.s. 散列表的拉链法 v.s. 基数排序
写代码:使用“双亲表示法”,定义顺序存储的树(以及森林)
写代码:使用“孩子表示法”,定义链式存储的树(以及森林)
对比:树的孩子表示法存储 v.s. 图的邻接表存储 v.s. 散列表的拉链法 v.s. 基数排序。你发现了什么?
写代码:使用“孩子兄弟表示法”,定义链式存储的树(以及森林)
自己动手创造,画一个结点总数不少于10的树,并画出对应的“双亲表示法、孩子表示法、孩子兄弟表示法”三种数据结构的示意图
自己动手创造,画一个至少包含3棵树的森林,并画出对应的“双亲表示法、孩子表示法、孩子兄弟表示法”三种数据结构的示意图
代码实现
“双亲表示法”顺序存储
#include <stdio.h>
#define MAX_TREE_SIZE 100//树中最多结点数
typedef int ElemType;
typedef struct //树的结点定义
{
ElemType data;//数据元素
int parent;//双亲位置域
}PTNode;
typedef struct
{
PTNode nodes[MAX_TREE_SIZE];
int n;
}PTree;
“孩子表示法”链式存储
typedef struct CTNode {
int child;
struct CTNode *next;
} *ChildPtr;
typedef struct {
ElemType data;
ChildPtr firstChild;
} CTBox;
typedef struct {
CTBox nodes[MAX_TREE_SIZE];
int n, r;
} CTree;
树的孩子表示法存储 v.s. 图的邻接表存储 v.s. 散列表的拉链法 v.s. 基数排序
存储方法 | 内容 | 相似之处 | 差异之处 |
孩子表示法 | 专注于表示树结构中的父子关系。每个节点都有一个指向其孩子节点的链表。便于实现树的各种遍历和操作。 优点:找孩子结点方便 缺点:找双亲结点不方便,需要遍历整个数组 | 这四种数据结构或算法都涉及到了链表的使用,无论是表示节点关系还是解决冲突。 它们都是为了解决特定问题而设计的,具有各自的优点和适用场景。 | 孩子表示法和图的邻接表存储是用于表示节点关系的,而散列表的拉链法是用于解决散列冲突的,基数排序则是一种排序算法。 它们的适用场景不同,孩子表示法适用于树结构,图的邻接表适用于图结构,散列表的拉链法适用于散列表中的冲突解决,基数排序适用于整数排序。 它们的实现方式和复杂度也不同,例如基数排序的时间复杂度可以达到O(d*(n+r)),其中d是位数,n是待排序列中记录的个数,r是基数的范围,而孩子表示法和图的邻接表存储则主要关注于空间复杂度和节点关系的表示。 |
图的邻接表 | 用于表示图结构中的节点关系。 | ||
散列表的拉链法 | 用于解决散列冲突的一种方法。 | ||
基数排序 | 一种非比较型整数排序算法。 按照低位先排序,然后收集;再按照高位排序,然后再收集的方式进行。 适用于整数排序,特别是当整数范围较大时。 |
“孩子兄弟表示法”链式存储
#include <stdio.h>
typedef int ElemType;
typedef struct CSNode
{
ElemType data;//数据域
struct CSNode *firstchild,*nextsibling;//第一个孩子和右兄弟指针
}CSNode,*CSTree;
画图表示
“双亲表示法”
1.树
2.森林
“孩子表示法”
1.树
2.森林