如何求解二叉树的深度,可以先分析一下下图:
在这个图中,根节点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;
}