树的存储结构
双亲表示法:
数组存储,每个结点中存储着其父亲结点在数组中的索引。
孩子表示法:
1)一个结点中存储着自己的数据域指针和指向其所有孩子的指针
2)由于1)会导致有大量儿子的结点存储的信息量太大,故改为数组中的一个结点存储着自己的数据域指针和指 向其第一个孩子的指针。然后非数组结点则有一个指针指向下一个兄弟的指针。
孩子兄弟表示法:
又称二叉树表示法,为什么这么叫,下面会解释。结点中除了数据域指针以外,还存储着指向第一个儿子的指 针,和下一个兄弟的指针。
typedef struct CSNode {
Elemtype data;
struct CSNode *firstChild, *nextSibling;
}CSNode, *CSTree;
我们知道,在二叉树的链式存储中,一个结点除了数据域指针以外,还有leftChild、rightChild两个指针。刚好树的孩子兄弟表示法里面,也有 firstChild 和 nextSibling 两个指针。所以当我们把这两个指针解释为二叉树的那两个指针的时候,这棵树就对应一棵二叉树了。所以啊,树的孩子兄弟表示法又名 “二叉树表示法”。引入[1]中的一个示例:
森林与二叉树对应:
先把,森林中的每棵树都按上面的规则转换成二叉树,然后,很显然地,你会发现--所有转换得到地二叉树的右子树都是空的。根据这个,我们就可以构造一个二叉树--把第二棵二叉树的根结点作为第一棵二叉树的根结点的右儿子,得到一棵二叉树。然后,把第三棵二叉树的根结点接到这棵二叉树中原第二棵二叉树的根结点,作为它的右子树,循环往复,我们就得到了一棵 “森林的二叉树”。
森林的先序遍历和中序遍历,即是其对应二叉树的先序遍历和中序遍历。也可以对各棵树,求出其二叉树,遍历,然后这些二叉树的遍历序列接起来。
树的先根、后根遍历,对应于二叉树的先序、中序遍历。
References:
[1] 数据结构(C语言版)严蔚敏 吴伟民 编著