关于二叉树宽度的算法包括递归和非递归

//方法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;
}

    原文作者:蒙昧的自己
    原文地址: https://blog.csdn.net/qq_28633157/article/details/49873681
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞