剑指 Offer 55 - I. 二叉树的深度|刷题打卡

86 阅读1分钟

题目描述

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

例如:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

提示:

节点总数 <= 10000

思路(递归)

可以说是树递归的经典问题了,很多人的递归启蒙应该就是求树的高度... 递归的写法是基于后序遍历的dfs,代码的核心思想是:

  1. 分别递归求得左子树和右子树的最大深度;
  2. 比较左右子树的最大深度,取其中较大的那个;
  3. 加上当前层的深度(+1)。 麻雀虽小,五脏俱全

C++代码(递归)

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(!root)return 0;
        return max(maxDepth(root->left), maxDepth(root->right)) + 1;
    }
};

思路(非递归)

当然如果你觉得递归解法太俗的话也可以选择更新(ma)颖(fan)的非递归方法:

  • 借助队列的广度优先遍历方法,每进行一层遍历就使计数 ++ ,直至队列中所有节点都已出队

C++代码(非递归)

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(!root)return 0;
        queue<TreeNode*> q;
        int count = 0;
        q.push(root);
        while(!q.empty()){
            int len = q.size();
            //一层一层地进行遍历,len为当前层的节点数量
            for(int i = 0; i < len; i ++ ){
                TreeNode* temp = q.front();
                q.pop();
                if(temp->left)
                    q.push(temp->left);
                if(temp->right)
                    q.push(temp->right);
            }
            count ++ ;
        }
        return count;
  }
};

本文正在参与「掘金 3 月闯关活动」,点击查看活动详情