leetcode:104. 二叉树的最大深度
题目
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
解答 & 代码
二叉树题目的递归(DFS)解法可以分两类思路:
- 解法一:遍历一遍二叉树得出答案:对应着 回溯算法核心框架
-
解法一:递归遍历(回溯)
/**
* Definition for a binary tree node.
* 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 {
private:
int cur_depth = 0; // 当前节点的深度
int max_depth = 0; // 二叉树的最大深度
// 递归遍历二叉树(深度优先搜索)
void dfs(TreeNode* root)
{
// 递归结束条件:到达 nullptr,更新最大深度
if(root == nullptr)
{
max_depth = max(max_depth, cur_depth);
return;
}
// 前序位置(代表进入当前节点),更新当前节点深度(深度 +1)
++cur_depth;
// 递归处理左右子树
dfs(root->left);
dfs(root->right);
// 后序位置(代表离开当前节点),节点深度 -1
--cur_depth;
}
public:
int maxDepth(TreeNode* root) {
dfs(root);
return max_depth;
}
};
复杂度分析:设二叉树共 N 个节点
- 时间复杂度 O(N):遍历每个节点一次
- 空间复杂度 O(log N):栈空间取决于递归深度,即二叉树的高度
执行结果:
执行结果:通过
执行用时:8 ms, 在所有 C++ 提交中击败了 62.84% 的用户
内存消耗:18.5 MB, 在所有 C++ 提交中击败了 23.56% 的用户
解法二:递归分解(动态规划)
后序遍历:先递归得到左子树的最大深度和右子树的最大深度,然后计算当前这棵树的最大深度
/**
* Definition for a binary tree node.
* 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) {
// 递归结束条件:当前节点为 nullptr,返回深度 0
if(root == nullptr)
return 0;
// 先递归得到左子树的最大深度和右子树的最大深度
int left_max_depth = maxDepth(root->left);
int right_max_depth = maxDepth(root->right);
// 后序位置,得到当前这棵树的深度(左右子树深度最大值 + 当前节点自己),并返回
return 1 + max(left_max_depth, right_max_depth);
}
};
复杂度分析:设二叉树共 N 个节点
- 时间复杂度 O(N):遍历每个节点一次
- 空间复杂度 O(log N):栈空间取决于递归深度,即二叉树的高度
执行结果:
执行结果:通过
执行用时:4 ms, 在所有 C++ 提交中击败了 91.71% 的用户
内存消耗:18.3 MB, 在所有 C++ 提交中击败了 87.70% 的用户