剑指offer--二叉树的深度
题目描述:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
本题采用队列和递归两种思路求解
- 先介绍用“队列”这种数据结构来求解,利用二叉树深度的过程来统计深度
1.如果是一颗空树,则返回深度为0
2.把树的根节点进队列
3.当队列中的数据元素不为空时,一直循环一下操作:队列的队头元素出队列,判断出队列的元素的左孩子是否为空,不为空则进队列,同样再判断有孩子;如果出队列的元素时某一层的最后一个节点,这深度加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*> nodeQueue;
TreeNode *p;
TreeNode *q = pRoot;//q变量是用来记录某一层的最右边(最后一个)的结点
int deep = 0;
nodeQueue.push(pRoot);
while(!nodeQueue.empty()){
p = nodeQueue.front();
nodeQueue.pop();
if(p->left!=NULL) nodeQueue.push(p->left);
if(p->right!=NULL) nodeQueue.push(p->right);
if(p==q){//判断是否是某一层最右边的结点
deep++;
q = nodeQueue.back();//记录下一层最右边的结点
}
}
return deep;
}
};
- 利用递归来求二叉树的深度,递归代码简单,但可能出现内存泄漏的问题
/*
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;
return 1+max(TreeDepth(pRoot->left),TreeDepth(pRoot->right));
}
};

浙公网安备 33010602011771号