树【二叉树】与森林的相互转化与遍历

一、树与森林的相互转换

预备知识:孩子兄弟表示法。

代码编写出来:

typedef struct CSNode{
	int data;
	struct CSNode *firstchild,*nextS;
}CSNode;

 解释:该结点的链域分别指向它的第一个孩子和它同级的兄弟。

(一)森林转换成树

step1:将森林里面的树转化为二叉树。(用孩子兄弟表示法)

如图:树【二叉树】与森林的相互转化与遍历_第1张图片

 step2:把这片转化后的森林再用一次孩子兄弟表示法表示成一颗大的二叉树。【这颗最终的二叉树是以A作为根结点的】

如图: 树【二叉树】与森林的相互转化与遍历_第2张图片

 (二)二叉树转换成森林

因为之前的森林我们已经知道是用孩子兄弟表示法做出来的,所以每个结点的右链指向的都是同一级的兄弟。

step1:

断掉这个二叉树的右链,它根结点所在的那一脉是森林中的树。【注意:因为A是这颗二叉树的根结点,所以A的右链都是与它同级森林的根结点】

如图:树【二叉树】与森林的相互转化与遍历_第3张图片

 step2:把断掉的右节点连到它兄弟的双亲上,(这也是它的双亲)

如图:树【二叉树】与森林的相互转化与遍历_第4张图片

二、遍历

树,二叉树,森林各种遍历总结:

树的前序遍历,对应二叉树的前序遍历。
树的后序遍历,对应二叉树的中序遍历。
树的层次遍历,对应二叉树的后序遍历。

森林的前序遍历,对应二叉树的前序遍历。
森林的中序遍历,对应二叉树的中序遍历。

树【二叉树】与森林的相互转化与遍历_第5张图片

 

你可能感兴趣的:(数据结构,数据结构)