刷题日常 5 二叉树最大深度

方法一:深度优先搜索

思路与算法

如果我们知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为

max(l,r)+1

而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。

1 / 10

C++

Java

Python

Golang

C

class Solution {

public:

int maxDepth(TreeNode* root) {

if (root == nullptr) return 0;

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

}

};

复杂度分析

时间复杂度:O(n),其中 n 为二叉树节点的个数。每个节点在递归中只被遍历一次。

空间复杂度:O(height),其中 height 表示二叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。

方法二:广度优先搜索

思路与算法

我们也可以用「广度优先搜索」的方法来解决这道题目,但我们需要对其进行一些修改,此时我们广度优先搜索的队列里存放的是「当前层的所有节点」。每次拓展下一层的时候,不同于广度优先搜索的每次只从队列里拿出一个节点,我们需要将队列里的所有节点都拿出来进行拓展,这样能保证每次拓展完的时候队列里存放的是当前层的所有节点,即我们是一层一层地进行拓展,最后我们用一个变量 ans 来维护拓展的次数,该二叉树的最大深度即为 ans。

C++

Java

Golang

C

class Solution {

public:

int maxDepth(TreeNode* root) {

if (root == nullptr) return 0;

queue<TreeNode*> Q;

Q.push(root);

int ans = 0;

while (!Q.empty()) {

int sz = Q.size();

while (sz > 0) {

TreeNode* node = Q.front();Q.pop();

if (node->left) Q.push(node->left);

if (node->right) Q.push(node->right);

sz -= 1;

}

ans += 1;

}

return ans;

}

};

复杂度分析

时间复杂度:O(n),其中 n 为二叉树的节点个数。与方法一同样的分析,每个节点只会被访问一次。

空间复杂度:此方法空间的消耗取决于队列存储的元素数量,其在最坏情况下会达到 O(n)。

相关推荐
LDG_AGI4 分钟前
【推荐系统】深度学习训练框架(九):推荐系统与LLM在Dataset、Tokenizer阶段的异同
人工智能·深度学习·算法·机器学习·推荐算法
爪哇部落算法小助手8 分钟前
每日两题day61
数据结构·c++·算法
Swift社区9 分钟前
LeetCode 439 - 三元表达式解析器
算法·leetcode·ssh
小殊小殊9 分钟前
重磅!DeepSeek发布V3.2系列模型!
论文阅读·人工智能·算法
裤裤兔11 分钟前
利用matlab进行FDR校正的实现方式
数据结构·算法·matlab·多重比较矫正·校正·fdr
野蛮人6号11 分钟前
力扣热题100道之31下一个排列
算法·leetcode·职场和发展
子一!!12 分钟前
哈希桶,元素插入逻辑实现
算法·哈希算法
敲代码的嘎仔12 分钟前
LeetCode面试HOT100——160. 相交链表
java·学习·算法·leetcode·链表·面试·职场和发展
吃着火锅x唱着歌12 分钟前
LeetCode 454.四数相加II
算法·leetcode·职场和发展
敲代码的嘎仔13 分钟前
LeetCode面试HOT100—— 206. 反转链表
java·数据结构·学习·算法·leetcode·链表·面试