计算二叉树的深度和宽度

来源:互联网 发布:源系统数据质量报告 编辑:程序博客网 时间:2024/06/07 16:02

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


在这个图中,根节点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);//取左右子树高度的最大值+1return 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;}



0 0
原创粉丝点击