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