如何求解二叉樹的深度,可以先分析一下下圖:
在這個圖中,根節點R的高度H1=max{左子節點高度H2,右子節點高度H3}+1;可以得出H1=H3+1;
而H2=max{H4,0}+1;H3=H5+1;
....;...
所以可以看出對高度的求解可以滿足以下遞歸:
求得左子樹的高度 LHeight;
求得右子樹的高度RHeight;
根的高度爲max(LHeight+1,RHeight;+1).
具體代碼如下:
int GetHeightInfo(BiNode *head){
int LHeight,RHeight;
//邊界條件
if (head==NULL) return 0;
//得到左子樹的高度
LHeight=GetHeightInfo(head->left);
//得到右子樹的高度
RHeight=GetHeightInfo(head->right);
//取左右子樹高度的最大值+1
return LHeight>RHeight? LHeight+1:RHeight+1;
}
二叉樹的深度求解,也可以先分析啊下圖:
求寬度本質上還是求各層的節點數,對寬度優先遍歷算法稍微改進,可以得到各層的節點值,寬度優先算法需要隊列,而層數的計算可以採用兩個參數來維持:
上層的節點數LastLayerValue;本層的節點數CurrentLayerValue;這樣就可以確定各層的節點數。
int GetWidthInfo(BiNode *head){
//需要保存的三個數據
int LastLayerValue;
int CurrentLayerValue;
int maxWidth=0;
//維護隊列
queue<BiNode *> myQueue;
if(head->data==NULL)
{
return 0;
}
else
{
LastLayerValue=1;
myQueue.push(head);
}
while(!myQueue.empty())
{
while(LastLayerValue!=0)
{
head=myQueue.front();
myQueue.pop();
if(head->left!=NULL)
{
myQueue.push(head->left);
}
if(head->right!=NULL)
{
myQueue.push(head->right);
}
LastLayerValue--;
}
CurrentLayerValue=myQueue.size();
LastLayerValue=CurrentLayerValue;
maxWidth=maxWidth>CurrentLayerValue? maxWidth:CurrentLayerValue;
}
return maxWidth;
}
最後給出求解兩者的函數:
/*
Description
給定一個二叉樹,獲取該二叉樹的寬度深度。
Prototype
int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight)
Input Param
head 需要獲取深度的二叉樹頭結點
Output Param
pulWidth 寬度
pulHeight 高度
Return Value
0 成功
1 失敗或其他異常
*/
int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight)
{
/*在這裏實現功能*/
*pulWidth=GetWidthInfo(&head);
*pulHeight=GetHeightInfo(&head);
return 0;
}