求二叉樹的寬度

二叉樹的寬度是指二叉樹各層結點個數的最大值。求二叉樹的寬度可以依據與二叉樹的層次遍歷,我們知道,二叉樹的層次遍歷藉助於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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章