计算二叉树的深度和宽度

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


在这个图中,根节点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;
}



  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值