在计算机科学中,树是一种非常重要的数据结构。它具有层次关系,广泛应用于各种算法和数据存储场景。
目录
一、树的分类
- 无序树:节点之间没有特定的顺序关系。在无序树中,无法通过某种固定的规则来确定节点的排列顺序。
- 有序树:节点之间存在特定的顺序关系。这种顺序可以是基于节点的值、插入的时间或者其他特定的规则。
- 二叉树:每个节点最多有两个子节点的树。
- 不完全二叉树:若二叉树中存在节点只有一个子树,或者部分节点缺少左子树或右子树,则为不完全二叉树。例如,一个二叉树的某一层可能没有完全填满节点,或者最后一层的节点没有从左到右依次排列。
- 完全二叉树:除了最后一层,其他每一层的节点数都是满的,并且最后一层的节点从左到右依次排列。完全二叉树的特点使得它可以方便地用数组进行存储和操作。
- 满二叉树:所有层的节点数都是满的二叉树。即每一层的节点数都是,其中为层数。
二、相关名词解释
- 树根:树的起始节点,也称为根节点。根节点是树中唯一没有父节点的节点,它是整个树的基础和起点。
- 分支节点:除了叶子节点之外的节点,它们至少有一个子节点。分支节点起到连接树的不同部分的作用,通过它们可以从根节点到达树的各个叶子节点。
- 叶子节点:没有子节点的节点。叶子节点是树的末端节点,它们不包含任何子树。
- 儿子节点:一个节点的直接子节点。例如,如果节点 A 有两个子节点 B 和 C,那么 B 和 C 就是 A 的儿子节点。
- 父亲节点:一个节点的父节点。在树中,除了根节点之外,每个节点都有一个唯一的父亲节点。
- 兄弟节点:具有相同父节点的节点。例如,如果节点 A 和节点 B 有相同的父亲节点 C,那么 A 和 B 就是兄弟节点。
- 树高 / 深度:从根节点到最远叶子节点的路径长度。树的高度反映了树的层次结构的深度,它是衡量树的大小的一个重要指标。
- 节点的度:一个节点的子节点个数。例如,如果节点 A 有三个子节点,那么节点 A 的度就是 3。
- 树的度:树中所有节点的度的最大值。树的度表示了树的分支程度,它反映了树的复杂程度。
三、存储方式
- 利用数组存储:可以使用数组来存储树的节点。对于完全二叉树,可以通过数组的下标来快速访问节点的父子节点。例如,对于一个有个节点的完全二叉树,可以将节点存储在数组的下标从 1 到的位置。如果节点的下标为n,那么它的左子节点的下标为2n,右子节点的下标为2n+1,父节点的下标为n/2。

- 利用链表存储:通常使用链表来存储树的节点,每个节点包含数据域和指针域,指针域指向其子节点。链表存储方式可以灵活地表示各种类型的树,不受树的形状和大小的限制。

四、链式结构遍历方式
对于链式存储的树结构,可以采用先根、中根、后根三种遍历方式。以下是用 C 语言实现的遍历函数:
void fun(Node *root) {
if(root == NULL) {
return;
} else {
printf("%d\n",root->data); // 先根遍历
fun(root->l);
printf("%d\n",root->data); // 中根遍历
fun(root->r);
printf("%d\n",root->data); // 后根遍历
}
}
先根遍历首先访问根节点,然后递归遍历左子树和右子树;中根遍历先递归遍历左子树,然后访问根节点,最后递归遍历右子树;后根遍历先递归遍历左子树和右子树,最后访问根节点。
6814

被折叠的 条评论
为什么被折叠?



