问题:仿照树的双亲孩子表示法,设计森林的双亲孩子存储结构。要求实现森林的先根、中根、后根遍历,能求森林的规模(森林中树的数目)、森林的高度(森林中树的最大高度)、森林的叶子数(森林中所有树的叶子之和)。
这是笔者在学习数据结构时遇到的一个题目。
以先根遍历为例。先根遍历需要先访问第一棵树的根结点,再先根遍历第一棵树根结点的子树组成的森林,再先根遍历除第一棵树之外的其他树组成的森林。那么最重要的是就是用什么来表示一个森林呢?对于一棵树我们可以通过它的根结点来表示,但是森林是由若干个树组成的,他是没有根结点的。所以我们就可以创造一个虚拟的根结点,来代表这整个森林。我们用这个虚拟根结点的第一个孩子来表示第一棵树的子树,再设置一个虚拟结点2,并且连接上除第一棵树之外的树,以表示这个森林。那么遍历的问题就迎刃而解。
例子如下。
代码如下:
//ParentChildForest.h
#ifndef PARENTCHILDFOREST_H
#define PARENTCHILDFOREST_H
#include "Node.h"
#include <iostream>
using namespace std;
template<class ElemType>
class ParentChildForest
{
public:
ParentChild<ElemType> a[50]; //存储空间
ParentChil