题解一: 深度优先
题解思路: 使用深度优先遍历所有根到叶节点的深度,树的深度等于左子树的深度与右子树深度的最大值+1.
图示:
图片说明
递归分析:
递归边界: 当root的为空,返回0
递归过程: 计算root左子树深度和root右子树深度

复杂度分析:
时间复杂度:O(N): 每个节点需要遍历一次
空间复杂度:
O(N)
: 最坏情况树退化为链表
实现如下:

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(!root) return 0;  //递归边界
         return max(maxDepth(root->left),maxDepth(root->right))+1;  //计算左子树和右子树深度取大者最后+1 = 树的深度
    }
};

题解二: 层次遍历
题解思路:使用层次遍历直接求二叉树的深度
分析:
1.自定义结构体node_deep表示每个节点所在的深度,其属性为TreeNode* node, int depth;
2.使用队列用于保存每层的节点
3.如果队列为空,就返回ans。
图示:
图片说明

复杂度分析:
时间复杂度:O(N) :每个节点需要遍历一次
空间复杂度:O(N) : 最坏情况树为完全平衡树,队列同时存储着N/2个节点。
实现如下:

class Solution {
public:
    /**
     *
     * @param root TreeNode类
     * @return int整型
     */
    struct node_deep{
        TreeNode* node;  //节点
        int depth;   //该节点所在的层
        node_deep(TreeNode* t = NULL,int d = 0):node(t),depth(d){};
    };

    int maxDepth(TreeNode* root) {
        // write code here
        if(!root) return 0;  //root为NULL,返回0
        int ans = 0;  //树的深度
        queue<node_deep*> q;
        node_deep* head = new node_deep(root,1);
        q.push(head);  //将根节点入队
        while(!q.empty()){
            node_deep * tmp = q.front(); q.pop();
            ans = tmp->depth;  //ans = 当前所在层深度
           //下一层的节点入队且depth+1
            if(tmp->node->left) {
                node_deep * left_node = new node_deep(tmp->node->left,tmp->depth+1); 
                q.push(left_node);
            }
            if(tmp->node->right){
                node_deep * right_node = new node_deep(tmp->node->right,tmp->depth+1);
                q.push(right_node);
            }
        }
        return ans;
    }
};

相关题目:
二叉树层序遍历