Hot100-Day42-T104二叉树的最大深度

14 阅读2分钟

Day42[26/4/11]T104二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100

解题思路

直接递归查找就完事了,递归函数设一个记录层数的变量,每次进入左子树或者右子树时这个变量+1,然后记录最大值就完事了。

但是这个思路可以改进:

上面这种思路是自顶向下的,另一种更简洁的解法,也就是 “自底向上” 的思路。

试想一下:如果我根本不关心“当前是第几层”,我只关心“我底下有多深”呢?

请顺着这个逻辑思考:

  1. 对于叶子节点:它没有左孩子,也没有右孩子,它的深度是多少?
    • 显然是 1。
  1. 对于一个普通节点:它有左子树和右子树。
    • 如果我知道了左子树的深度是 L,右子树的深度是 R
    • 那我这个节点的深度是多少?
    • 肯定是 max(L,R)+1 对吧?(左右取最高的,加上我自己这一层)。

这就是“自底向上”的精髓:
我不记录“我走到了哪”,而是问我的孩子“你们有多高?”,然后基于孩子的答案算出我的高度。

Code

#include <algorithm>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution
{
public:
    int maxDepth(TreeNode *root)
    {
        if (root == nullptr)
        {
            return 0;
        }

        return (max(maxDepth(root->left), maxDepth(root->right)) + 1);
    }
};