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。
- 对于一个普通节点:它有左子树和右子树。
-
- 如果我知道了左子树的深度是
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);
}
};