树结构基础概念

1 定义

为什么要有树结构?

在维护一个动态的数据集合(需要增删查)的时候,二叉树(树结构的一种)可以在增删查的时候时间复杂度都是O(logn)。

而线性的数据结构则做不到,原因如下:

例如下面这些数据:


无序数据结构.png

如果使用的是数组结构:
增加元素直接在最后添加一个元素即可,复杂度是O(1)。
删除元素的时候,如果删除的是第1个元素,则剩余的所有元素都要往前移动,复杂度成了O(n)。
查找一个特定的元素的时候,最差的情况下需要遍历所有元素,复杂度是O(n)。

如果采用用链表结构,则增加和删除元素都可以做到O(1),查找还是O(n)。

如果采用的是有序的数据结构

有序数据结构.png

如果使用的是数组结构:
增加元素也还是O(1)。
删除元素也还是O(n)。
查找一个特定的元素的时候,因为是有序的,所以可以采用二分法,复杂度可以达到O(logn)。

如果采用用链表结构,则增加和删除元素都可以做到O(1),查找还是O(n),因为是链表结构,无法使用二分法,无法定位中间的元素是第几个元素。

所以使用线性的数据结构无法在增删查的时候都做到O(logn)的复杂度,而使用树结构则可以做到。



树是什么?

是n(n>=0)个结点的有限集。n=0时称为空树。

在任意一棵非空树中:

  1. 有且仅有一个特定的称为根的结点;
  2. 当n>1时,其余节点可分为m(m>0)个互不相交的有限集,其中每一个几何本身又是一棵树,并且称为根的子树。

结点

  1. 结点包含一个数据元素和若干个指向子树的分支。
  2. 结点拥有的子树数量称为结点的度(Degree)
  3. 度为0的节点称为叶结点(Leaf)终端结点;度不为0的结点称为非终端结点分支结点
  4. 除根结点外,分支结点也称为内部结点

树的度是树内各结点的度的最大值。

结点的子树的根称为该结点的孩子(Child)
该结点称为该孩子双亲(Parent)
同一个双亲结点之间互称兄弟(Sibling)

结点的层次(Level)从根开始定义起,根为第一层。
双亲在同一层的结点互为堂兄弟
树中结点的最大层次称为树的深度(Depth)或高度

森林(Forest)是m(m》=0)棵互不相交的树的集合。

2 存储结构

双亲表示法:每个结点设置一个指向该结点双亲的指针域。
孩子表示法
将结点连接起来存在1个链表。
链表的每个结点,都有一个存储自己子结点的链表。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容