和我一起学习前端算法 ——数据结构☞树

522 阅读5分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。

本来想取名为《前端算法入门》的,但是又担心自己水平不够把大家带沟里了,所以此系列文章就改名为和我一起学习前端算法

树这种数据结构大家都听说过吧?这是一种 JS 中虽然没有特别提到,但在前端又无处不在的数据类型。

感觉没有印象?我提醒一下, 文档对象模型 (DOM) 大家都耳熟能详吧,这就是我们最常接触到的树了。你要说你连这个都不知道,那我只能说出门左拐不送了😭。。。

前端中的树

说起前端中的树,那首先就是 DOM 树了。

<html>
  <head>
    <title>DOM 树</title>
  </head>
  <body>
    <div>
      我是内容
    </div>
  </body>
</html>

这个大家都很熟悉了,根节点是 html ,head 和 body 是兄弟节点,div 是 html 的子孙节点,html 是 div 的祖先节点,body 是 div 的父节点。。。

那现在要你给 “树” 这种结构下个准确的定义,你会怎么下呢?

啥是树啊

经过上面的提醒,大家可能对树有了个模糊的印象:那种有 “兄弟” 又有 “孩子” 的数据结构。。。这么说到也没错就是了🤦‍♂️

首先我们得知道什么是 树状结构

树状结构

树状结构(英语:Tree structure),又译树形结构,或称树状图(tree diagram)是一种将层次结构式的构造性质,以图象方式表现出来的方法。它的名称来自于以的象征来表现出构造之间的关系,虽然在图象的呈现上,它是一个上下颠倒的树,其根部在上方,是资料的开头,而下方的资料称为叶子。

树形结构是一层次的嵌套结构。 一个树形结构的外层和内层有相似的结构, 所以,这种结构多可以递归的表示。树状结构只是一个概念,可以用许多种不同形式来展现。在数学图论集合论中,对于树状结构的性质探讨是一个重要课题。在计算机科学中,则以树状数据结构作为讨论主题。

树 (数据结构)

知道了树状结构的定义,接下来就可以给 “树” 这种数据结构下定义了。

在计算机科学中,(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

  • 每个节点都只有有限个子节点或无子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;
  • 树里面没有环路(cycle)

树中需要用到的术语

  1. 节点的度:一个节点含有的子树的个数称为该节点的度;
  2. 树的度:一棵树中,最大的节点度称为树的度;
  3. 叶节点终端节点:度为零的节点;
  4. 非终端节点分支节点:度不为零的节点;
  5. 父亲节点父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
  6. 孩子节点子节点:一个节点含有的子树的根节点称为该节点的子节点;
  7. 兄弟节点:具有相同父节点的节点互称为兄弟节点;
  8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  9. 深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0;
  10. 高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;
  11. 堂兄弟节点:父节点在同一层的节点互为堂兄弟;
  12. 节点的祖先:从根到该节点所经分支上的所有节点;
  13. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
  14. 森林:由m(m>=0)棵互不相交的树的集合称为森林;

以上术语比较多,但是真正需要记忆的点不多,大部分我们都已经接触过了。比如说:父、孩子、兄弟、子孙、祖先节点,这些在 DOM 树 结构中我们已经早就接触过了。然后还有高度、深度和层次,也是和对应的几何形状相符的。

结语

树的基本定义我们现在了解了,接下来再来了解一下算法里面常出没的 “二叉树”

本文为系列文章,将和大家一起逐步的学习前端算法相关知识。

系列所有文章都将收录在 专栏 里方便大家查看,大家可以关注我或者收藏本专栏。