题目
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
注: 叶子节点是指没有子节点的节点。
示例
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回它的最大深度 3
解法
深度优先遍历-递归实现( Python )
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if(root == None):
return 0
d_left = self.maxDepth(root.left)
d_right = self.maxDepth(root.right)
depth = 1 + (d_left if d_left >= d_right else d_right)
return depth
基本思路
首先要考虑递归的基准情况,即root
为None时要返回,然后就可以放心大胆地分成左右子树进行递归了,但不能忘了树的深度是子树最大深度+1。
复杂度分析
因为访问了树的所有节点,所以时间复杂度为 O ( N ) O\left( N \right) O(N)。在最糟糕的情况下,即每个结点只有左子节点,此时递归会被调用N次,空间复杂度为 O ( N ) O \left( N\right) O(N),平均情况下为 O ( l o g N ) O \left( logN \right) O(logN)。
广度优先遍历-迭代实现( Python )
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if(root == None):
return 0
n_stack = [root]
depth = 0
while(n_stack != []):
length = len(n_stack)
while length:
n_tmp = n_stack.pop(0)
length -= 1
if(n_tmp.left):
n_stack.append(n_tmp.left)
if(n_tmp.right):
n_stack.append(n_tmp.right)
depth += 1
return depth
基本思路
考虑用栈来实现迭代,Python的List
可以很方便实现这一点。这里的关键在于变量Length
,它记录了每一层节点的数量,然后分别访问这些节点,将它们存在的子节点压入栈中,同时深度增加。
复杂度分析
因为要访问所有节点,所以时间复杂度为 O ( n ) O \left( n \right) O(n)。空间上栈的最大长度等于树的最大宽度,最大为 O ( ⌈ N 2 ⌉ ) O \left( \lceil \frac{N}{2} \rceil \right) O(⌈2N⌉)。