//方法1:关于递归算法的实现,递归算法的实现包含两个函数,在这个函数中需要借助数组来实现
//实现的具体方式,是在循环遍历的过程中,将每一层中的节点数都存储到相应的数组空间中
//在对二叉树进行遍历结束后,在对数组进行处理,便可以获得,相应的二叉树的宽度
//子啊该方法的实现机制中,利用了辅助函数
//方法2:关于非递归的算法,就是利用队列的原理,这一原理在求树的深度那一篇博文,便已经涉及到了
//他的原理是每一此循环结束后,在队列中的永远是同一层的节点,不存在不是同一层的节点出现在队列中
//此时,通过获得队列的长度,便可以得到二叉树的宽度
void BinaryTree<T>::CountLine(BinaryTreeNode<T>* str,int* ptr,int i)
{
//ptr是记录每层的节点数的数组,i是指树的某一层
if (str != NULL)
{
//每次递归都将该层的节点数加到相应的数组中去
ptr[i]++;
CountLine(str->leftChild, ptr, i + 1);
CountLine(str->rightChild, ptr, i + 1);
}
}
template<typename T>
int BinaryTree<T>::FindMaxLine()
{
//开辟相应的数组来存储每层的节点数
int height = Height();
int* str = new int[height];
for (int i = 0; i < height; i++)
str[i] = 0;
//获得节点数
CountLine(this->root, str, 0);
int max = 0;
//对数组进行处理,获得最大值
for (int i = 0; i < height; i++)
{
if (max < str[i])
max = str[i];
}
return max;
}
template<typename T>
int BinaryTree<T>::CountLine()
{
//利用非递归的方法求出每层的节点数
BinaryTreeNode<T>* str = this->root;
if (str == NULL)
return 0;
queue<BinaryTreeNode<T>*>node;
node.push(str);
int max = 0;
while (!node.empty())
{
int cur = 0;
int curSize = node.size();
while (cur < curSize)
{
cur++;
str = node.front();
node.pop();
if (str->leftChild)
node.push(str->leftChild);
if (str->rightChild)
node.push(str->rightChild);
}
if (max < curSize)
max = curSize;
}
return max;
}