剑指offer38_二叉树的深度_题解
二叉树的深度
题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
示例1
输入
{1,2,3,4,5,#,6,#,#,7}
返回值
4
分析
方案一:递归
此树的深度=左子树的深度与右子树的深度中的最大值 +1。
代码
/**
1.时间复杂度:O(n)
N 为树的节点数量,计算树的深度需要遍历所有节点。
2.空间复杂度:O(n)
最差情况下(当树退化为链表时),递归深度可达到 N 。
**/
class Solution
{
public:
int TreeDepth(TreeNode *pRoot)
{
if (!pRoot)
{
return 0;
}
return 1 + max(TreeDepth(pRoot->left), TreeDepth(pRoot->right));
}
};
方案二:层序遍历
代码
/**
1.时间复杂度 O(N): N 为树的节点数量,计算树的深度需要遍历所有节点。
2.空间复杂度 O(N): 最差情况下(当树平衡时),队列 queue 同时存储 N/2 个节点。
**/
class Solution
{
public:
int TreeDepth(TreeNode *pRoot)
{
if (!pRoot)
return 0;
queue<TreeNode *> q;
q.push(pRoot);
int level = 0;
while (!q.empty())
{
int sz = q.size();
while (sz--)
{
auto node = q.front();
q.pop();
if (node->left)
q.push(node->left);
if (node->right)
q.push(node->right);
}
level += 1;
}
return level;
}
};