大话数据结构007 树

树是典型的的一对多的关系

有且仅有一个称为根节点的元素,如图中的A,子树数量不做限制,但是不存在交叉。

大话数据结构007 树

以下不是树:

大话数据结构007 树

节点拥有的子树的个数称为,度为0的节点称为叶子结点或者终端节点,度不为0的节点称为非叶子节点或者分支节点

树的就是全部子树的度的最大值

 

大话数据结构007 树

父级节点称为双亲,子节点称为孩子。同一个双亲的子节点之间互为兄弟

大话数据结构007 树

树的深度是树的最高层级。

大话数据结构007 树

树中的各个节点之间存在次序,称为有序树,否则称为无序树

森林是多个互不相交的树的集合。

 

树的模型

 

大话数据结构007 树

大话数据结构007 树

 

树的存储结构1 :双亲表示法

 

大话数据结构007 树

data存储本节点的数据,parent存的是指针,存储双亲节点的位置

大话数据结构007 树

我们以一个树为例:

大话数据结构007 树大话数据结构007 树

根节点的双亲默认为-1

这样,我们可以根据双亲节点的指针迅速的找到双亲节点的位置。

但是,这样的存储结构还是有问题,怎么找到子节点呢?

大话数据结构007 树

我们增设长子指针。

 

树的存储结构2 :孩子表示法

 

对于每个节点,我们使用多重链表存储孩子域。

方法一:使用树的度来分配指针个数。(一个指针对应着一个子树的根节点)

 

大话数据结构007 树

大话数据结构007 树大话数据结构007 树

 

 方法二:每个节点的指针的个数就是本节点的度。

 

大话数据结构007 树

data存储数据,degree存储的是本节点的度,后面是本节点的指针域。

大话数据结构007 树大话数据结构007 树

 

我们结合上述两种方法,来看孩子表示法:

将每个节点的孩子排列起来,以单链表作为存储结构,n个节点就会有n个链表,n个头指针组成一个线性表,存放到一维数组中。

大话数据结构007 树大话数据结构007 树

左侧的数组存储的是各个节点的链表的位置(长子的存储位置)。

同一行属于同一个双亲的兄弟节点。

大话数据结构007 树

这样查找孩子是方便的,但是找双亲是很难的,需要遍历。

我们稍作改进,添加双亲指针即可:

大话数据结构007 树

 

树的存储结构3:孩子兄弟表示法

 

为长子添加右兄弟指针域:

大话数据结构007 树

大话数据结构007 树