求二叉树的宽度

二叉树的宽度是指二叉树各层结点个数的最大值。求二叉树的宽度可以依据与二叉树的层次遍历,我们知道,二叉树的层次遍历借助于deque实现,每次打印当前结点后将其左子树右子树入队,此时队列中既包含当前层的结点,也包含下一层的结点,若我们将当前层的结点全部出队,剩余的就是下一层的结点个数。所以,我们可以使用maxWidth来表示最大宽度,若下一层的结点个数大于maxWidth,则更新maxWidth,最终队列为空,得到的maxWidth即为二叉树的宽度。

以下是C++实现的源代码:

//求二叉树的宽度
int WidthOfBiTree(BiTree root)
{
if(root == NULL)
return 0;

int maxWidth = 0;
deque<BiTree> d;
d.push_back(root);

while(true)
{
    int len = d.size();
    if(len == 0)
        break;
    while(len > 0)
    {
        BiTree temp = d.front();
        d.pop_front();
        len--;
        if(temp->Lchild)
            d.push_back(temp->Lchild);
        if(temp->Rchild)
            d.push_back(temp->Rchild);
    }
    maxWidth = maxWidth > d.size() ? maxWidth : d.size();

}
return maxWidth;

}

作者:ColiYin
来源:CSDN
原文:https://blog.csdn.net/sinat_20177327/article/details/78289905
版权声明:本文为博主原创文章,转载请附上博文链接!

/* 二叉树的宽度 在上一层遍历完成后,下一层的所有节点已经放到队列中,此时队列中的元素个数就是下一层的宽度*/
/**********************************************************************/
int WidthOfBinaryTree(BinaryTreeNode
pNode){
if (pNode == NULL)
{
return 0;
}
std::deque<BinaryTreeNode
> dequeTreeNode;//双端队列
int maxWidth = 1;//最大的宽度,用于当只有一个节点时候返回1
dequeTreeNode.push_back(pNode);//头结点入队
while (true)
{

	int length = dequeTreeNode.size();//当前层节点的个数
	if (length == 0)//当前层没有节点,跳出循环
	{
		break;
	}
	while (length > 0)//如果当前层还有节点
	{
		BinaryTreeNode* pTemp = dequeTreeNode.front();
		dequeTreeNode.pop_front();//出队
		length--;//长度减一
		if (pTemp->m_pLeft)
		{
			dequeTreeNode.push_back(pTemp->m_pLeft);//下一层节点入队
		}
		if (pTemp->m_pRight)
		{
			dequeTreeNode.push_back(pTemp->m_pRight);//下一层节点入队
		}
	}
	maxWidth = maxWidth > dequeTreeNode.size() ? maxWidth : dequeTreeNode.size();//得到最大宽度
}
return maxWidth;

}

posted @ 2018-11-29 22:24  Philtell  阅读(879)  评论(0编辑  收藏  举报