降维问题:顺序、链式存储结构的二叉树递归遍历、层次遍历求高度
全部源代码在最后
一、概要设计
测试数据:如图所示森林
森林采用兄弟孩子链表表示法。
森林的数据输入采取输入兄弟孩子链表表示法下的等价二叉树的扩展先序遍历形成的线性串的方法(原理为森林先序遍历结果与等价二叉树的先序遍历结果相同)
输入数据:ABEK..F..CG..DH.I.J...L.MN...
算法设计
以链式存储结构为例
递归遍历求高度:由于孩子兄弟链表表示法是把兄弟当儿子,所以对应二叉树的所有左子树的最大高度便是森林的高度。这样,在求二叉树高度的算法上可以改进,将左子树给定权重1,右子树给定权重0;即只需
if(root == NULL) return 0;
return max(GetHeightByRecursion(root->firstson) + 1, GetHeightByRecursion(root->nextbrother));
层次遍历求高度:利用队列,将第一个儿子入队,再进行一系列循环操作
实验结果
二、 详细设计
1. 链式存储结构
- 森林链表
template<typename T>
struct ForestNode
{
T data;
ForestNode<T>* firstson;
ForestNode<T>* nextbrother;
ForestNode()
{
firstson = NULL;
nextbrother = NULL;
}
};
- 森林类
template<typename T>
class Forest
{
public:
Forest() {};
~Forest(){};
ForestNode<T>* getFirstTreeRoot(){};
void build(ForestNode<T>* & node){};
void deleteAll(ForestNode<T>* node){};
int LevelTraversalAndReturnHeight(ForestNode<T>* root){};
int GetHeightByRecursion(ForestNode<T>* root){};
private:
ForestNode<T>* FirstTreeRoot;
};
- 构造函数
Forest()
{
Fir