题目
给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
示例
给定一个三叉树:
1
/ | \
3 2 4
/ \
5 6
返回其最大深度 3。
说明:
-
树的深度不会超过
1000
。 -
树的节点总不会超过
5000
。
解法
一、DFS递归 ( Python )
class Solution:
def maxDepth(self, root: 'Node') -> int:
if(root == None):
return 0
depth = 0
for node in root.children:
tmp = self.maxDepth(node)
if(tmp > depth):
depth = tmp
return depth + 1
基本思路
确定基准情形root == None
时的返回值,然后遍历所有子树,从中选取最深的即可。但是这里不要将depth
设置为实例变量,否则遍历所有子树时会共享这个变量,那么depth
等于所有子树深度的累加。
复杂度分析
时间复杂度为
O
(
N
)
O \left( N \right)
O(N),因为会遍历所有节点。空间复杂度在线性树时最差,为
O
(
N
)
O \left(N \right)
O(N),在满N叉树时为
O
(
l
o
g
T
N
)
O \left( log_T N \right)
O(logTN),其中T
表示T叉树。
二、BFS迭代( Python )
class Solution:
def maxDepth(self, root: 'Node') -> int:
if(root == None):
return 0
n_queue = [root]
depth = 0
while n_queue:
length = len(n_queue)
while length:
node = n_queue.pop(0)
n_queue.extend(node.children)
length -= 1
depth += 1
return depth
基本思路
基于宽度优先遍历的思想,把每一层的所有节点都遍历完之后再进入下一层,并且depth
加一。因为要遍历完一层的所有节点,同时会有子节点加入,所以用queue
先进先出的特点来实现。
复杂度分析
时间复杂度为
O
(
N
)
O \left( N \right)
O(N)。空间上采用了queue
,对于满T叉树而言,队列的最大长度等于最后一层的节点数量,大约相当于总节点数的
T
T
+
1
\frac{T}{T+1}
T+1T,所以空间复杂度还是
O
(
N
)
O\left( N \right)
O(N)。