二叉树的最大深度
题目描述:
解题思路:
- 第一种:递归。这个思路应该说是最容易想到的了。我是设了另一个函数来递归计算这个最大深度。我们分几种情况来讨论,首先先排除掉这两个特殊情况:如果二叉树为空,返回
0
,如果二叉树只有根节点,也就是没有任何子节点,返回1
。然后我们需要想,如果这棵二叉树的某个结点有左右两个子节点,那么,下一次递归我们对这两个子节点都要递归一次,然后取其中递归最深的那次深度,因为每次能够递归就说明这个节点有子节点,也就是下面还有一层深度,所以每次递归完成返回值都要+1
。然后如果遇到这个结点只有左子结点或者右子节点,那么我们就只考虑有子节点的那一边,开始递归。直到最后的子节点没有左右子节点了,说明就到底了,所以就只剩下当前这一行了,所以就返回1
。最后递归结束返回的数值就是这个二叉树的最大深度了。 - 时间复杂度:O(N)
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if not root:
return 0
if not root.left and not root.right:
return 1
return self.CountTree(root)
def CountTree(self, Tree):
if not Tree.left and not Tree.right:
return 1
if Tree.right and Tree.left:
return 1 + max(self.CountTree(Tree.left), self.CountTree(Tree.right))
if Tree.right:
return 1 + self.CountTree(Tree.right)
if Tree.left:
return 1 + self.CountTree(Tree.left)
- 第二种:改进版递归。这个方法我们可以尝试不要另外设函数,这里我们直接在当前函数递归,也不难理解,我们就分两种情况递归,也就是求这个二叉树的左半边的最大深度和右半边的最大深度,然后返回这两个深度最大的那个,就是这个二叉树的最大深度,其他的细节和第一种都很类似,就不再写了。
- 时间复杂度:O(N)
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if not root:
return 0
if not root.left and not root.right:
return 1
else:
left_max = 1 + self.maxDepth(root.left)
right_max = 1 + self.maxDepth(root.right)
return max(left_max, right_max)