来源:互联网 发布:js中undefined null 编辑:程序博客网 时间:2024/05/16 17:21

一、树的定义

树是n(n>=0)个结点的有限集,是一对多的数据结构,N=0叫空树。不可能存在多个根节点,子树一定是互不相交的。


结点拥有的子树称为结点的度。度为0的结点称为叶结点或终端结点;度不为0的结点称为非终端结点或分支结点。除根节点外,分支结点也称为内部结点。树的度是树内各结点度的最大值,如图此树度为3

结点子树的根称为该结点的孩子,该结点称为孩子的双亲。同一个双亲的孩子之间互称为兄弟,双亲在同一层的互为堂兄弟(D,E,F)。

结点的祖先是从根到该节点所经分支上的所有结点(H的祖先D,B,A)

结点的子孙是以结点为根的子树的结点(B的子孙D G H I)

树中结点的最大层次称为树的深度或高度,如图为4

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

如果将树中的结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。

线程结构和树的不同:


二、树的存储结构

⑴双亲表示法

在每个结点中,附设一个指示器指示其双亲结点在数组中的位置


data是数据域,存储结点的数据信息,parent是指针域,存储该结点的双亲在数组中的下标,我们把根结点的parent设为-1


这样的存储结构很容易找到它的双亲结点,但是不利于找结点的孩子和兄弟之间的关系,我们做如下改进

①增加一个结点最左边孩子的域(长子域),没有孩子的结点设为-1,

②增加一个右兄弟域记录右兄弟下标,没有右兄弟设为-1


具体情况可以具体分析。

⑵孩子表示法


每个结点的孩子结点排列起来,以单链表作存储结构。然后将n个头指针组成一个线程表,采用顺序存储结构,放进一个一维数组中。

这里要设立两种结点结构:

一个是孩子链表的孩子结点


一个是表头数组的表头结点


这种表示方法不利于找双亲结点,我们可以在顺序存储结构加上双亲结点


⑶孩子兄弟表示法

设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟



这样其实就把一个复杂的树变成二叉树了。

三、树和森林的遍历方式

⑴树的遍历:


①先根遍历,先访问树的根结点,然后依次先根遍历根的每棵子树,ABEFCDG

②后根遍历,先依次后根遍历每棵子树,然后再访问根结点,EFBCGDA

⑵森林的遍历:


①前序遍历:

先根遍历每棵树, ABCDEFGHJI

②后序遍历:

后根遍历每棵树, BCDAFEJHIG



0 0