题目地址
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最大深度 3 。
解题思路(参考:图解 104. 二叉树的最大深度 | 递归/Python/Golang 详细解答)
题目要求求出二叉树的最大深度,我们知道,每个节点的深度与它左右子树的深度有关,且等于其左右子树最大深度值加上 1,可以写作:
maxDepth(root) = max(maxDepth(root.left), maxDepth(root.right)) + 1
以 [3,9,20,null,null,15,7] 为例,根节点 3 的深度取决于它左右子树的深度:
因其左右子树深度尚不可知,我们需要对其一一求解。
先来看左子树,即以 4 为根节点的子树,因为它没有左右子节点,所以深度为 1:
再来看以 20 为根节点的右子树,同理,它的深度也取决于左右子树的深度:
它的左子节点 15 与右子节点 7 的情况与上述节点 4 相同,左右子节点均为空,所以这两个节点的深度也是 1。由此我们可以得出节点 20 的深度为 2,推导过程如下:
max(左子树最大深度, 右子树最大深度) + 1
=
max(1, 1) + 1
=
1 + 1
=
2
这样一来,我们知道了所有子节点的深度,各节点深度如下:
由此可得根节点 3 的深度为:
max(左子树最大深度, 右子树最大深度) + 1
=
max(1, 2) + 1
=
2 + 1
=
3
上述推导过程整体如下:
maxDepth(3-root)
=
max(maxDepth(4-sub), maxDepth(20-sub)) + 1
=
max(1, max(maxDepth(15-sub), maxDepth(7-sub)) + 1) + 1
=
max(1, maxDepth(1, 1) + 1) + 1
=
max(1, 2) + 1
=
2 + 1
=
3
在推导过程中我们看到 maxDepth() 函数频繁出现,即我们在频繁地求取某节点的最大深度。由此可见,「求节点的最大深度」是该题的子问题,该题最直观的解答方式是用递归求解。
递归设计
在递归算法中,递归函数的设计非常重要,首先我们要先明确该函数的作用,然后再确定何时结束与何时调用该函数。
明确函数作用
该函数的作用用一句话概括就是:计算节点的最大深度。
- 函数输入:确定的节点
- 函数输出:该节点的最大深度
何时结束
当输入的节点为空节点时,我们无需继续计算其子树的深度,此时可以直接结束递归函数,并返回空节点的深度为 0。
何时调用
当输入节点为非空节点时,该节点的深度取决于其左右子树的深度,即:
maxDepth(root) = max(maxDepth(root.left), maxDepth(root.right)) + 1
此时需要进行函数的递归调用。
代码实现:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if root is None:
return 0
return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def maxDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root == None:
return 0
left_high = self.maxDepth(root.left)
right_high = self.maxDepth(root.right)
return max(left_high,right_high) + 1