主要内容 #
- 问题描述
- 求解思路
- 参考代码
1. 问题描述 #
输入一棵二叉树的根节点,求该树的深度。从根节点到叶子节点依次经过的节点(含根、叶子节点)形成树的一条路径,最长路径为树的深度。

例如,在上图的二叉树深度为4,因为它从根节点到叶子节点最长路径包含4个节点(从根节点1开始,经过节点2和5,最终到达叶子节点7)。
2. 求解思路 #
我们从另一个角度来理解树的深度问题。
如果一棵树只有一个节点,那么它的深度是1。
如果根节点只有左子树而没有右子树没有右子树,那么树的深度就是左子树的深度加1。
同样,如果根节点只有右子树没有左子树,那么树的深度应该是其右子树的深度加1。
如果既有右子树又有左子树,那么该树的深度就是气左右子树深度较大值加1。
例如在图1所示的二叉树中,根节点为1的树有左、右两棵子树,其中左、右子树的根节点分别为节点2和节点3。根节点为2的左子树的深度为3,而根节点为3的右子树深度为2,因此,根节点为1的树的深度就是4。这种思路用递归的方法很容易实现。
3. 参考代码 #
#include <iostream>
#include <algorithm>
#include <queue //使用队列
using namespace std;
struct TreeNode {
    int     val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {
    }
};
// 方法一:递归、DFS
class Solution {
public:
    int TreeDepth(TreeNode* pRoot)
    {
        if ( pRoot == nullptr )
            return 0;
        int left = TreeDepth( pRoot->left );
        int right = TreeDepth( pRoot->right );
        return 1 + max( left , right );
    }
};
// 方法二:BFS,层次遍历
class Solution_2 {
public:
    int maxDepth(TreeNode* root) {
        int ans = 0;
        if ( root == nullptr )
            return ans;
        queue<TreeNode*> Q;
        Q.push( root );
        while ( !Q.empty() ) {
            int scale = Q.size();  // 「必须」单独声明
            for ( int i = 0; i < scale; ++i ) {
                TreeNode* cur = Q.front();  Q.pop();
                if ( cur->left )
                    Q.push( cur->left );
                if ( cur->right )
                    Q.push( cur->right );
            }
            ++ans;  // 每一层 +1
        }
        return ans;
    }
};
int main()
{
    TreeNode *head = new TreeNode(5);
    head->left = new TreeNode(3);
    head->right = new TreeNode(8);
    head->left->left = new TreeNode(2);
    head->left->right = new TreeNode(4);
    head->right->left = new TreeNode(7);
    head->right->right = new TreeNode(10);
    head->right->left->left = new TreeNode(6);
    head->right->right->left = new TreeNode(9);
    head->right->right->right = new TreeNode(11);
    Solution solve;
    cout << solve.TreeDepth(head) << endl;
    return 0;
}