双亲表示法
除了根结点外,其余每个结点,它不一定有孩子,但是一定有且只有一个双亲。
我们假设以一组连续空间存储树的结点,同时,在每个结点中,附设一个指示器指示其双亲结点在链表中的位置。
结点结构
data:数据域,存储结点的数据信息。
parent:指针域,存储该结点的双亲在数组中的下标。
实现
由于根结点是没有双亲的,所以,约定根结点的位置域设置为-1。
这样的存储结构,我们可以根据结点的parent指针很容易找到它的双亲结点,所以用到时间复杂度为o(1),知道parent为 -1 时,表示找到了树的根。
问题1
可我们要知道结点的孩子是什么,该怎么做?请遍历真个结构。
遍历整个结构太麻烦,可以这样改进:
我们增加一个结点最左边孩子的域,不妨叫它长子域,这样就很容易得到结点的孩子。如果没有孩子的结点,这个长子域,就设置为-1.
如图:
问题2
我们很关注各兄弟之间的关系,双亲表示法无法体现这样的关系,该怎么办?
我们可以增加一个右兄弟域来体现兄弟关系,也就是说,每一个结点如果它存在右兄弟,则记录下右兄弟的下标。同样的,如果右兄弟不存在,则赋值为-1
问题3
但是,如果结点的孩子很多,超过了两个。我们又关注结点的双亲、又关注结点的孩子、还关注结点的兄弟,而且对时间遍历要求还比较高,那么我们还可以把此结构扩展为有双亲域、长子域、再有右兄弟域。
存储结构的设计是一个非常灵活的过程,一个存储结构设计的是否合理,取决于该存储结构的运算是否合适,是否方便,时间复杂度好不好等。