数据结构-> 树

122 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

树的定义

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

当n = 0时,称为空树。

任意一棵非空树中应满足:

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

树是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:

  • 树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
  • 树中所有结点可以有零个或多个后继。

基本概念

image.png

  • 度:树中一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度
  • 叶子结点:度为0(没有子女结点)的结点
  • 分支节点:度大于0的结点
  • 树的高度:树中结点的最大层数
  • 有序树和无序树:树中结点的各子树从左到右是有次序的,不能互换,称该树为有序树,否则称为无序树
  • 森林:m (m≥0)棵互不相交的树的集合

树的特征

  • 树中的结点数等于所有结点的度数加1.
  • 度为m mm的树中第i层上至多有m^{i-1}个结点(i > = 1)
  • 高度为h的m叉树至多有(m^h-1)/(m-1)个结点。
  • 具有n个结点的m叉树的最小高度为[ l o g m ( n ( m − 1 ) + 1 ) ] 。

树的存储结构

双亲表示法

image.png

我们假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。也就是说,每个结点除了知道自已是谁以外,还知道它的双亲在哪里。

存储结构

image.png

data是数据域,存储结点的数据信息。而parent是指针域,存储该结点的双亲在数组中的下标。

这样的存储结构,我们可以根据结点的parent 指针很容易找到它的双亲结点,所用的时间复杂度为0(1),直到parent为-1时,表示找到了树结点的根。

孩子表示法

image.png

把每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成-一个线性表,采用顺序存储结构,存放进一个一维数组中。

存储结构有两种

image.png

child是数据域,用来存储某个结点在表头数组中的下标。next 是指针域,用来存储指向某结点的下一个孩子结点的指针。

image.png

data是数据域,存储某结点的数据信息。firstchild 是头指针域,存储该结点的孩子链表的头指针。

这样的结构对于我们要查找某个结点的某个孩子,或者找某个结点的兄弟,只需要查找这个结点的孩子单链表即可。对于遍历整棵树也是很方便的,对头结点的数组循环即可

双亲孩子表示法

image.png

把每个节点的孩子结点排列起来,以单链表作为存储结构。如果有n个结点就有n个孩子链表,如果是叶子结点则单链表为空。n个头指针又组成一个线性表,采用顺序存储结构,存放在一个以一维数组中

孩子兄弟表示法

image.png

任意一棵树, 它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。 因此,我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。

存储结构

image.png

data是数据域,firstchild 为指针域,存储该结点的第一个孩子结点的存储地址,rightsib 是指针域,存储该结点的右兄弟结点的存储地址。

这种表示法,给查找某个结点的某个孩子带来了方便