111. 二叉树的最小深度
问题描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最小深度 2.
解题思路:
依旧是使用递归的思想来解,每次获取左节点和右节点的最小长度
有一点不同是
最小深度是从根节点到最近叶子节点的最短路径上的节点数量
。而
叶子节点的定义是叶子节点是指没有子节点的节点
。对于
3
/
9
只存在一边这种情况,那么如果我们获取左节点和右节点中的最小长度,那么结果会是0,显然是不对的。所以当树只有左节点或者右节点的时候,我们需要返回存在的节点的长度。
代码实现:
# 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 minDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root is None:
return 0
if root.left and root.right:
left_height,right_height = self.minDepth(root.left),self.minDepth(root.right)
return min(left_height,right_height) + 1
else:
return max(self.minDepth(root.left),self.minDepth(root.right)) + 1
112. 路径总和
问题描述:
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
解题思路:
递归思想
边界条件,如果路径上所有节点值相加等于目标和 且 路径上的最后一个节点是叶子节点
递归方法中,如果root为空,直接返回False;如果是叶子节点,即左节点和右节点都为空且所有节点值相加等于目标和,则返回True,否则返回False;如果不是叶子节点,则recall递归方法,直到找到叶子节点。每次需要更新目标和为sum-root.val
代码实现:
# 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 hasPathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: bool
"""
#这条路径上所有节点值相加等于目标和。
# 且最后一个leaf 节点
if root is None:
return False
if root.left is None and root.right is None and root.val== sum:
return True
else:
return self.hasPathSum(root.left,sum-root.val) or self.hasPathSum(root.right,sum-root.val)
118. 杨辉三角
问题描述:
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
解题思路:
首先观察结果,每行的第一个和最后一个都是1
接下来,从第二行开始,添加的值为左上方和右上方的数的和,也就是他的上一行列表中,需要添加的数的索引减一的值和该索引对应的值之和。这里以第4行第二个3举例。需要添加的数3在大列表中所在行索引为3,在他本身列表中索引为2。他的值为上一行(行索引为2)中索引为1的值加上索引为2的值,也就是2+1.
于是,首先要根据numRows判断有多少行。每一行都是一个列表。其次,如果是第一个和最后一个,添加1;否则下一行添加的值为左上方和右上方的数的和。也就是list[i-1][j-1]+list[i-1][j]
代码实现:
class Solution(object):
def generate(self, numRows):
"""
:type numRows: int
:rtype: List[List[int]]
"""
result = []
for i in range(numRows):
result.append([])
for j in range(i+1):
if j in (0,i):
result[i].append(1)
else:
result[i].append(result[i-1][j-1]+result[i-1][j])
return result