計算二叉樹的深度和寬度

如何求解二叉樹的深度,可以先分析一下下圖:


在這個圖中,根節點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;
}



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