题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
一、递归版本;
若存在左子树,则将左子树深度加1;
若存在右子树,则将右子树深度加1;
若左右子树均存在,则将左、右子树深度均加1取最大值;
细节见代码:
int TreeDepth(TreeNode* pRoot)
{
if (pRoot == NULL)
{
return 0;
}
return max(1+TreeDepth(pRoot->left), 1 + TreeDepth(pRoot->right));
}
二、个人感觉需要尝试写写非递归,过程可以更清晰;
利用队列作为辅助数据结构,每次将一层的兄弟结点入队,再出队列,当兄弟结点均出队完,若队列不空,则深度加1;重复上述过程直至队列为空,这就是利用了所谓广度优先遍历二叉树的方法;细节见代码:
int TreeDepth(TreeNode* pRoot)
{
if (pRoot == NULL)
{
return 0;
}
//非递归版本
int len = 0;
int level = 0;
queue<TreeNode *> q;
q.push(pRoot);
while (!q.empty())
{
len = q.size();
level += 1;
while (len--)
{
TreeNode* node = q.front();
q.pop();
if (node->left)
{
q.push(node->left);
}
if (node->right)
{
q.push(node->right);
}
}
}
return level;
}