C语言--树

在计算机科学中,树是一种非常重要的数据结构。它具有层次关系,广泛应用于各种算法和数据存储场景。

目录

一、树的分类

二、相关名词解释

三、存储方式

四、链式结构遍历方式


一、树的分类

  1. 无序树:节点之间没有特定的顺序关系。在无序树中,无法通过某种固定的规则来确定节点的排列顺序。
  2. 有序树:节点之间存在特定的顺序关系。这种顺序可以是基于节点的值、插入的时间或者其他特定的规则。
  3. 二叉树:每个节点最多有两个子节点的树。
    • 不完全二叉树:若二叉树中存在节点只有一个子树,或者部分节点缺少左子树或右子树,则为不完全二叉树。例如,一个二叉树的某一层可能没有完全填满节点,或者最后一层的节点没有从左到右依次排列。
    • 完全二叉树:除了最后一层,其他每一层的节点数都是满的,并且最后一层的节点从左到右依次排列。完全二叉树的特点使得它可以方便地用数组进行存储和操作。
    • 满二叉树:所有层的节点数都是满的二叉树。即每一层的节点数都是,其中为层数。

二、相关名词解释

  1. 树根:树的起始节点,也称为根节点。根节点是树中唯一没有父节点的节点,它是整个树的基础和起点。
  2. 分支节点:除了叶子节点之外的节点,它们至少有一个子节点。分支节点起到连接树的不同部分的作用,通过它们可以从根节点到达树的各个叶子节点。
  3. 叶子节点:没有子节点的节点。叶子节点是树的末端节点,它们不包含任何子树。
  4. 儿子节点:一个节点的直接子节点。例如,如果节点 A 有两个子节点 B 和 C,那么 B 和 C 就是 A 的儿子节点。
  5. 父亲节点:一个节点的父节点。在树中,除了根节点之外,每个节点都有一个唯一的父亲节点。
  6. 兄弟节点:具有相同父节点的节点。例如,如果节点 A 和节点 B 有相同的父亲节点 C,那么 A 和 B 就是兄弟节点。
  7. 树高 / 深度:从根节点到最远叶子节点的路径长度。树的高度反映了树的层次结构的深度,它是衡量树的大小的一个重要指标。
  8. 节点的度:一个节点的子节点个数。例如,如果节点 A 有三个子节点,那么节点 A 的度就是 3。
  9. 树的度:树中所有节点的度的最大值。树的度表示了树的分支程度,它反映了树的复杂程度。

三、存储方式

  • 利用数组存储:可以使用数组来存储树的节点。对于完全二叉树,可以通过数组的下标来快速访问节点的父子节点。例如,对于一个有个节点的完全二叉树,可以将节点存储在数组的下标从 1 到的位置。如果节点的下标为n,那么它的左子节点的下标为2n,右子节点的下标为2n+1,父节点的下标为n/2。

5ae2084acef64a45bb4e5bf009ba380e.png

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

2699d35720c54529b02c31516abe594d.png

  

四、链式结构遍历方式

对于链式存储的树结构,可以采用先根、中根、后根三种遍历方式。以下是用 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); // 后根遍历
    }
}

先根遍历首先访问根节点,然后递归遍历左子树和右子树;中根遍历先递归遍历左子树,然后访问根节点,最后递归遍历右子树;后根遍历先递归遍历左子树和右子树,最后访问根节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值