题目标题:
-
求二叉树的宽度和深度
-
给定一个二叉树,获取该二叉树的宽度和深度。
-
-
例如输入
-
a
-
/ \
-
b c
-
/ \ / \
-
d e f g
-
-
返回3.
详细描述:
-
接口说明
原型:
int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight)
输入参数:
head 需要获取深度的二叉树头结点
输出参数(指针指向的内存区域保证有效):
pulWidth 宽度
pulHeight 高度
返回值:
0 成功
1 失败或其他异常
代码如下:
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
typedef struct tagBiNode //定义二叉树结构
{
char data;
struct tagBiNode *left;
struct tagBiNode *right;
} BiNode;
int getWidth(BiNode* head) //求宽度
{
if (head == NULL)
return 0;
queue<BiNode*> q;//定义一个队列
q.push(head);//根结点入队
int width = 1, current = 1;//初始化上一层和当前层的宽度
while (!q.empty())
{
while (current--)
{
if (q.front()->left != NULL)//队列头结点不为空,则入队
q.push(q.front()->left);
if (q.front()->right != NULL)
q.push(q.front()->right);
q.pop();//队列头元素出队
}
current = q.size();//当前层的宽度,即队列的长度
width = max(width, current);//取上一层和当前层宽度的最大值
}
return width;
}
int getHeight(BiNode* head) //递归求深度
{
if (head == NULL)
return 0;
return max(getHeight(head->left), getHeight(head->right)) + 1;//左右子树深度的最大值加1
}
int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight)
{
*pulWidth = getWidth(&head);
*pulHeight = getHeight(&head);
return 0;
}
参考资料:
这里