题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
考察点:二叉树的理解;学习能力;知识迁移。
思路1:递归思想,如果一棵树只有一个根节点,那么深度为1,如果只有左孩子,那就是左孩子的深度+1,如果只有右孩子,那就是右孩子的深度+1,如果左右孩子都有的话,那就是比较大的那个数值+1,函数的返回值就是树的深度。返回条件是根节点为空返回0.
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
if (pRoot == NULL)
return 0;
int left = TreeDepth(pRoot->left);
int right = TreeDepth(pRoot->right);
return left > right ? (left + 1) : (right + 1);
}
};
思路2:非递归思想,参考二叉树的层次遍历,每一层遍历结束就层数+1;每层节点数就是当前队列的个数。
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)
{
queue<TreeNode*> q;
if (pRoot == NULL)
return 0;
int level = 0;//层数
q.push(pRoot);
while (!q.empty())
{
int length = q.size();//获取本层的节点个数
level++;
while (length--)//本层只需要出队length个元素
{
TreeNode* pNode = q.front();//获取队首元素
if (pNode->left)
{
q.push(pNode->left);
}
if (pNode->right)
{
q.push(pNode->right);
}
q.pop();//出队,也可放在前面。
}
}
return level;
}
};