一、树的存储结构
1)双亲表示法
以一组地址连续的空间存储树的结点,同时在结点中附设一个指针域指示其双亲结点的位置。
这种存储结构利用每个孩子只有一个双亲的性质,求结点的双亲可以在常量时间内实现,但求结点的孩子时需要遍历整个结构。
2)孩子表示法
树中每个结点可能有多个孩子,所以结点除了一个数据域外,还需要有多个指针域指向孩子结点。
有如下两种结点格式:
同构结点:假设d为树的度,则每一个结点都有d个指针域。但是树中可能会有很多结点的度小于d,所以同构结点会有很多空的指针域,空间比较浪费。
异构结点:结点结构中包含两个数据域,一个存放结点数据,一个结点存放结点的度(假设为n),另外还有n个指针域指向指向结点的n个孩子。
3)孩子兄弟法(二叉树法)
以二叉链表作为树的存储结构,链表中结点的两个指针域分别指向该结点的第一个孩子结点和下一个兄弟结点。
二、森林和二叉树的转换
由于二叉树和树都可以用二叉链表作为存储结构,则以二叉链表作为媒介可导出树与二叉树之间的一个对应关系。也就是说,给定一棵树可以找到唯一的一棵二叉树与之对应。
将森林中每一棵树的根结点视为兄弟关系,根据孩子兄弟表示法,很容易将森林与唯一的一棵二叉树对应;由于这种对应关系是唯一的,所以给定一棵二叉树,必然能得到与之对应的森林。
三、树和森林的遍历
1)树的遍历
A:先根遍历:先访问树的根节点,然后依次先根遍历根的每棵子树;
B:后根遍历:先依次后根遍历每棵子树,然后访问根结点。
2)森林的遍历
A:先序遍历森林:访问森林中第一棵树的根结点,先序遍历第一棵树中根结点的子树森林,先序遍历剩余树构成的森林。
B:中序遍历森林:中序遍历森林中第一棵树的子树森林,访问第一棵树的根结点,中序遍历剩余树构成的森林。