题目描述:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
个人思路:
遇“树”不决,先递归!个人的主要思路是通过递归去寻找叶子结点。当遇到叶子结点时,尝试去更新目前最大深度;不是叶子结点时,再去查找它的左右孩子。关键点是需要维护一个类的属性变量max_depth去记录目前最大的深度。递归问题的思路就是:只考虑目前root结点需要怎么处理,处理完之后,再递归调用左右孩子就行了。
具体代码如下:
# 递归
class Solution:
def __init__(self):
self.max_depth = 0
def maxDepth(self, root: TreeNode) -> int:
if not root:
return 0
def helper(root, depth):
if not root:
return
if (not root.left) and (not root.right): # 叶子结点,尝试更新最大深度
self.max_depth = max(self.max_depth, depth)
return self.max_depth
if root.left:
helper(root.left, depth + 1)
if root.right:
helper(root.right, depth + 1)
helper(root, 1)
return self.max_depth
# 迭代
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if not root:
return 0
stack = [(1, root)]
max_depth = 1
while stack:
cur_max_depth, node = stack.pop()
if (not node.left) and (not node.right): # 叶子结点,尝试更新最大深度
max_depth = max(cur_max_depth, max_depth)
else:
if node.left:
stack.append((cur_max_depth + 1, node.left))
if node.right:
stack.append((cur_max_depth + 1, node.right))
return max_depth