剑指 Offer 55 - I. 二叉树的深度

题目描述

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

例如:

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

1
2
3
4
5
3
/ \
9 20
/ \
15 7

返回它的最大深度 3 。

提示:

  1. $节点总数 <= 10000$

注意:本题与主站 104 题相同:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/


算法 1

(BFS,迭代) $O(n)$

我们可以发现二叉树的最大深度正好是二叉树的层树,所以只需在层序遍历每一层的过程中记录层数即可,每多一层深度就加 $1$。

时间复杂度

二叉树中的每个节点只会被遍历一次,所以时间复杂度为 $O(n)$。

空间复杂度

$O(logn)$,最坏情况下二叉树呈链状,空间复杂度为 $O(n)$

C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 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) {
int res = 0;
if (!root) return res;

queue<TreeNode*> q;
q.push(root);

while (q.size()) {
int sz = q.size();
while (sz -- ) {
auto t = q.front();
q.pop();
if (t->left) q.push(t->left);
if (t->right) q.push(t->right);
}
res ++ ;
}

return res;
}
};

算法 2

(DFS,递归) $O(n)$

  1. 递归函数的含义:求当前树的高度(高度即最大深度)
  2. 递归的出口:如果当前节点为空节点,高度为 0
  3. 单层递归的逻辑:按后序遍历的顺序,先求左子树的高度,再求右子树的高度,最后取左右子树高度的最大值 + 1 即为当前节点的高度。

时间复杂度

二叉树中的每个节点只会被遍历一次,所以时间复杂度为 $O(n)$。

空间复杂度

$O(logn)$,最坏情况下二叉树呈链状,空间复杂度为 $O(n)$

C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if (!root) return 0;
return max(maxDepth(root->left), maxDepth(root->right)) + 1;
}
};
Author: tonngw
Link: https://tonngw.com/2022/07/08/剑指 Offer/剑指 Offer 55 - I. 二叉树的深度/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.