JS数据结构(9)—— 树结构
1.什么是树结构
树结构是一种非线性结构,以分层的方式存储数据。
现实中关于树结构的例子有家谱,还有公司的组织架构等。
树结构的抽象:
树结构的优点:
每种数据结构都有自己特定的应用场景,树结合了其他数据结构(数组,链表,哈希表)的优点。在模拟某些场景时,我们使用树结构会更加的方便。
因为树结构是非线性的,可以表示一对多的关系,我们可以使用树表示文件的目录结构。
2.树结构的术语
树(Tree):n(n>=0)个节点构成的有限集合。
空树:n = 0 时,就称为一个空树。
根(Root):位于树顶部的节点,它没有父节点。
子树(SubTree):子树由节点和它的后代构成。
父节点:有子树的节点是它的子树的根节点的父节点。
子节点:A是B的父节点,则B是A的子节点。
兄弟节点:具有同一个父节点的不同子节点互称为兄弟节点。
节点的度:节点的子树个数。
树的度:树的所有节点中最大的度数。
叶节点:度为0的结点。
节点的层次:根节点是第一层,其他的节点的层次是它的父节点的层次加1。
树的深度:数中所有节点的最大层次是这棵树的深度。
路径和路径长度:从节点A到节点H的路径是一个节点序列A,B,C…,H。路径所包含边的个数为路径的长度。
3.树的表示方法
(1)最普通的表示法
但是以这个方法表示树,因为树的节点个数不一样,所以在定义的时候很难实现。
(2)儿子-兄弟表示法
每一个节点由三个属性表示(数据,左子节点,兄弟节点)
比如A节点(数据是A,左子节点是B,无兄弟节点)
比如C节点(数据是C,左子节点是G,兄弟节点是D)
(3)儿子-兄弟表示法旋转
旋转之后,就变成了一个二叉树(每个节点最多只能有两个子节点)
任何的一棵树,都可以用二叉树来模拟出来。
4.二叉树
二叉树:树中的每个节点最多只能有两个子节点。
二叉树由根节点,左子树(TL)和右子树(TR)组成。
二叉树可以为空,也就是没有节点。
二叉树的形态:
二叉树的重要特性:
一个二叉树的第i层的最大节点数是:2^(i-1) ,i >= 1
深度为k的二叉树最大节点数是:2^k - 1, k >= 1
对于任何非空二叉树,若n0表示叶节点的个数,n2是度为2的非叶节点的个数,那么 n0=n2+1
二叉树的存储:
二叉树常见的存储方式是数组和链表。
(1)使用数组:
完全二叉树:从上至下,从左至右顺序存储。
但是大部分情况都不是完全二叉树。
如果把所有的二叉树都按照完全二叉树来存储的话,会造成很大的空间浪费。
(2)使用链表(常用):
把每个节点封装成一个Node节点,Node中包含存储的数据,左节点的指针,右节点的指针。
Node节点:
二叉树:
还有一种特殊的二叉树——二叉搜索树
关于二叉搜索树可以看我的另外一篇博客 二叉搜索树
(如果有什么错误,欢迎大佬在评论区指正,thank you~)