數(shù)據(jù)結(jié)構(gòu)拓展習(xí)題:二叉樹(shù)的繁茂度
題目:一棵二叉樹(shù)T的繁茂度定義為各層結(jié)點(diǎn)數(shù)的最大值(也稱二叉樹(shù)的寬度)和二叉樹(shù)的高度的乘積。試設(shè)計(jì)算法,求給定二叉樹(shù)T的繁茂度。






int Depth(BiTree T)//計(jì)算樹(shù)的深度
{
?????? int m = 0;
?????? int n = 0;
?????? if (T == NULL)
????????????? return 0;
?????? else
?????? {
????????????? m = Depth(T->lchild); //計(jì)算左子樹(shù)的深度
????????????? n = Depth(T->rchild); //計(jì)算右子樹(shù)的深度
????????????? if (m > n)
???????????????????? return m + 1;
????????????? else
???????????????????? return n + 1;
?????? }
}
int Width(BiTree T) //計(jì)算樹(shù)的寬度
{
?????? if (T == NULL)//如果是空樹(shù)則寬度為0
????????????? return 0;
?????? LinkQueue Q;
?????? InitQueue(Q);
?????? EnQueue(Q, T);
?????? BiTNode* p;
?????? int width = 1;
?????? int m;
?????? while (!QueueEmpty(Q))
?????? {
????????????? m = QueueLength(Q);//m為隊(duì)列長(zhǎng)度
????????????? if (width < m)//width取最長(zhǎng)的隊(duì)列
???????????????????? width = m;
????????????? for (int i = 0; i < m; i++)//將樹(shù)的下一層所有結(jié)點(diǎn)入隊(duì)
????????????? {
???????????????????? DeQueue(Q, p);
???????????????????? if (p->lchild)
??????????????????????????? EnQueue(Q, p->lchild);
???????????????????? if (p->rchild)
??????????????????????????? EnQueue(Q, p->rchild);
????????????? }
?????? }
?????? return width;
}
?
int Lushness(BiTree T) //計(jì)算樹(shù)的繁茂度
{
?????? return Depth(T) * Width(T);
}