题目:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
方法一:
递归的方法,比较简单
/*
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==NULL)return 0;
int left=TreeDepth(pRoot->left);
int right=TreeDepth(pRoot->right);
return 1+max(left,right);
}
};
方法二:
非递归写法:层次遍历
用层序遍历的方法,每遍历一层就将层数加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)
{
if(pRoot==NULL)
return 0;
queue<TreeNode*>rel;
rel.push(pRoot);
int count=0;
while(!rel.empty()) //每次循环代表遍历一层节点
{
int len=rel.size();
count++;
while(len--) //每次循环压入一个节点的孩子,该循环将该层所有节点的孩子压入队列中
{
TreeNode* t = rel.front(); //取队列的第一个元素
rel.pop(); //该节点已经保存,弹出该节点,保证下次循环应该压入队列第一个节点的孩子
if(t->left!=NULL)
rel.push(t->left);
if(t->right!=NULL)
rel.push(t->right);
}
}
return count;
}
};