python实现leetcode_Leetcode(Python实现)-简单的部分[Day10],LeetCodePython,Easy

本文介绍了如何使用递归解决二叉树的最小深度问题,通过计算从根节点到最近叶子节点的节点数量。同时,讨论了判断路径总和是否等于给定目标值的方法,并演示了如何生成杨辉三角的前n行。这些算法展示了递归在树形结构中的应用。
摘要由CSDN通过智能技术生成

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. 杨辉三角

问题描述:

52dc19769dadfd6a279a27749ba44de8.gif

给定一个非负整数 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值