题目描述

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

题目分析:

  • 可以采用递归求解,也可以采用层次遍历
  • 层次遍历的话我们需要借助队列帮助我们遍历,先将根节点入队,如果队列不空则一直循环。循环内先拿到对头节点再进行出队,如果左右树不空就入队,根据队列元素大小来确定执行次数,吗,每完成一次层次遍历就将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));
    }
};