【数据结构】树 (Trees)

本文介绍了树这种数据结构,包括树的基本术语:节点、根节点、子树、父节点、子节点、路径、路径长度、节点的度和等级/深度。还探讨了树的实现方法,如父指针实现和子列表实现,并讨论了不同子列表实现的优缺点,如静态数组、自动扩容数组和链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I. 阅读前你所需要的基础知识

  1. 了解数组 (array)
  2. 此文章内容并非二叉树 (binary tree),而是普通的树

II. 树 (Trees) 以及其相关术语

  • 什么是树:树是一种数据结构,由许多个节点 (node)分支 (branch) 构成。下图为一个树,可以发现每一个节点就像现实中的树叶,分支则像树枝,故此结构得名“树”。
    在这里插入图片描述
  • 节点:节点是树内存储数据的地方 (例如大图中的A,B,C等等)
  • 根节点 (root node): 一个树内最顶端的节点 (例如大图中的A)
  • 子树 (subtrees): 子树是一个树内,选择任意一个非根节点作为子树根节点后,形成的树 (例如下图,是大图中的树的一个子树)
    在这里插入图片描述
  • 父节点 (parent node): 一个节点的父节点是在上一层级与自己相连的节点 (例如大图中,C是H的父节点,D是J的父节点)
  • 子节点 (child node): 一个父节点下一层级中与之连接的任意一个节点 (例如大图中,F是B的一个子节点,I是D的一个子节点)
  • 路径 (path): 树内的一个路径是一条由节点组成的序列。在路径中,除了第一个节点以外,其余每一个节点的前一个节点都必须是它的父节点 (例如大图中,{ABG}是一条路径,{AC}是一条路径)
  • 路径长度 (path’s length): 一个路径中分支的数量。注意,路径长度并不是一个路径内节点的数量,而是分支数量 (例如路径{ABG}的路径长度为2)
  • 节点的度 (degree): 一个节点的度等于其拥有的子节点数量 (例如大图中,A的度为3,D的度为2)、
  • 节点的等级 (level) /深度 (depth): 一个节点的等级/深度是指从根节点到当前节点这条路径的长度 (例如H的等级/深度为2)
  • 树的高度 (height): 当前树内最长路径的长度,出于计算方便,可以实用这个公式:层级数 - 1 (例如大图中的数的高度为2)
  • 节点的高度:以当前节点为子树父节点形成子树,此节点高度即为子树的高度 (例如大图中,B的高度为1,H的高度为0)

III. 树的实现方法

  1. 父指针实现 (The parent pointer implementation): 所有的节点被存储在同一容器中,每个子节点会指向其父节点 (此方法泛用性较低,因为我们无法访问一个节点的子节点,只能通过子节点访问父节点)
    在这里插入图片描述

  2. 子列表实现 (The list of children implementation): 每个节点有自己独立的一个列表,用于存储其所有子节点 (此方法较为泛用)在这里插入图片描述

  • 子列表实现的“列表”,我应如何选择
    • 静态数组:如果你每一个节点拥有固定数量的子节点 (例如二叉树),那么你可以选择用容量不变的静态数组
    • 自动扩容数组:如果你每个节点内的子节点数量不定,但你又比较懒,你可以使用自动扩容数组 (例如C++中的std::vector)。自动扩容数组的缺点在于,他往往会占用多于你需求的内存
    • 链表 (linked list):如果你每个节点内的子节点数量不定,那链表一定是个不错的选择,它并不会像自动扩容数组一样占用你额外的内存。

感谢您的阅读,如若发现问题请在评论区告知,我会及时修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值