题目
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
想法一:递归
算法实现
def maxDepth(self, root: TreeNode) -> int:
if not root:
return 0
return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))
执行结果
执行结果 : 通过
执行用时 : 44 ms, 在所有 Python3 提交中击败了82.46%的用户
内存消耗 : 15 MB, 在所有 Python3 提交中击败了5.99%的用户
复杂度分析
-
时间复杂度:O(n)
-
空间复杂度:O(n)
迭代
算法实现
def maxDepth(self, root: TreeNode) -> int:
stack = []
if root:
stack.append((1, root))
depth = 0
while stack:
current_depth, root = stack.pop()
if root:
depth = max(depth, current_depth)
stack.append((current_depth + 1, root.left))
stack.append((current_depth + 1, root.right))
return depth
执行结果
迭代:利用双队列
算法实现
def maxDepth(self, root: TreeNode) -> int:
if not root:
return 0
queue = deque()
queue.append(root)
ans = 0
while queue:
ans += 1
for _ in range(len(queue)):
node = queue.popleft()
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return ans
执行结果
小结
DFS深度优先搜索
用栈(stack)来实现,整个过程可以想象成一个倒立的树形:
- 把根节点压入栈中。
- 每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
- 找到所要找的元素时结束程序。
- 如果遍历整个树还没有找到,结束程序。
BFS广度优先搜索
使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:
- 把根节点放到队列的末尾。
- 每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。
- 找到所要找的元素时结束程序。
- 如果遍历整个树还没有找到,结束程序。
这次结合之前所做的题,才了解到了这两种基本的策略,有了这两种策略应该大部分树的问题都可以解决了。