概述
- 前言
- 104 二叉树的最大深度【简单】
- 111 二叉树的最小深度 【简单】
- 124 二叉树中的最大路径和 【困难】
- 后记
前言
我前面的文章《python 实现二叉树的深度&&广度优先遍历
》介绍了二叉树的相关知识。《LeetCode 102 && 429 广度优先遍历
)》这篇做了一些关于广度优先遍历的题,那么今天就来做做深度优先遍历的题。请看题:
104 二叉树的最大深度 90.36%
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
思路
嗯,这题是深度优先遍历中基本遍历方法的变种,就多了后面的几行代码
解答
def maxDepth(root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
left = maxDepth(root.left)
right = maxDepth(root.right)
if left == 0 and right != 0:
left = left + 1
if right == 0 and left != 0:
right = right + 1
return max(left, right) + 1
111 二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最小深度 2.
思路
解答
# 111. 二叉树的最小深度 84.52
def minDepth(self,root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
left = self.minDepth(root.left)
right = self.minDepth(root.right)
if left == 0 and right != 0:
return right + 1
if left != 0 and right == 0:
return left + 1
return min(left, right) + 1
124 二叉树中的最大路径和
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
思路
见题中注释
解答
# 124 二叉树中的最大路径和 效率 63.94
def maxPathSum(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.result = -2 ** 31
self.recursive(root)
return self.result
def recursive(self, root):
if root == None:
return 0
# 当左右子树,是小于 0 的时候,就将左右子树赋值为 0 ,因为题干是要求最大值,所以不可能去加一个负数
left = max(0, self.recursive(root.left))
right = max(0, self.recursive(root.right))
# 比较当前节点下的最大值与上一个节点的值,将比较之后的结果记录下来
self.result = max(self.result, root.val + left + right)
# 注意审题,【从树中任意节点出发,达到任意节点的序列。】且【最大路径和】。这里是返回给父节点使用的,
# 所以,可以返回 root.val (就是当前节点),也可以返回 root.val + max(left, right) (就是当前节点和他的子树)。
# 又因为是求【最大路径和】所以最外层也使用了一个 max() 函数
return max(root.val, root.val + max(left, right))
后记
今天的题就到这里了,都是循序渐进的,由一开始的基础遍历到现在的做题,一步一个脚印。加油!!
往期推荐:
本文首发于公众号【zone7】,关注获取最新推文。