题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
题目分析:
- 可以采用递归求解,也可以采用层次遍历
- 层次遍历的话我们需要借助队列帮助我们遍历,先将根节点入队,如果队列不空则一直循环。循环内先拿到对头节点再进行出队,如果左右树不空就入队,根据队列元素大小来确定执行次数,吗,每完成一次层次遍历就将depth+1;
- 就如上图所示,先将节点2入队,经历层次遍历后,5和4入队,2出队,进行第二层的遍历;5和4的左右树都不空,再将它们的左右树入队,进行第三层的遍历...最终队列为空得到树的深度。
参考代码:
方法一:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
int TreeDepth(TreeNode* pRoot) {
if(pRoot == nullptr)
return 0;
queue<TreeNode*> q;
q.push(pRoot);
int depth = 0;
while(!q.empty())
{
int sz = q.size();
depth++;
for(int i = 0; i < sz; ++i)
{
TreeNode* node = q.front();
q.pop();
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
}
}
return depth;
}
};
方法二:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
int TreeDepth(TreeNode* pRoot) {
if(pRoot == nullptr)
return 0;
//最大的子树深度就是整个树的深度
return 1 + max(TreeDepth(pRoot->left), TreeDepth(pRoot->right));
}
};