「这是我参与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层,以此类推;
- 深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0;
- 高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;
- 堂兄弟节点:父节点在同一层的节点互为堂兄弟;
- 节点的祖先:从根到该节点所经分支上的所有节点;
- 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
- 森林:由m(m>=0)棵互不相交的树的集合称为森林;
以上术语比较多,但是真正需要记忆的点不多,大部分我们都已经接触过了。比如说:父、孩子、兄弟、子孙、祖先节点,这些在 DOM 树 结构中我们已经早就接触过了。然后还有高度、深度和层次,也是和对应的几何形状相符的。
结语
树的基本定义我们现在了解了,接下来再来了解一下算法里面常出没的 “二叉树”
本文为系列文章,将和大家一起逐步的学习前端算法相关知识。
系列所有文章都将收录在 专栏 里方便大家查看,大家可以关注我或者收藏本专栏。