本文讲述了python基础编程100例:第59期-基础结构:二叉树 路径总和!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:
第59期-基础结构:二叉树 路径总和
1 问题描述
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
示例 1:
输入: root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出: true
示例 2:
输入: root = [1,2,3], targetSum = 5
输出: false
示例 3:
输入: root = [1,2], targetSum = 0
输出: false
初始代码
from typing import List
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def list_to_binarytree(nums):
if nums==[]:return
b=root=TreeNode(nums[0])
a=[]
i=1
while i < len(nums):
if nums[i]:
root.left=TreeNode(nums[i])
a.append(root.left)
if i+1<len(nums):
if nums[i+1]:
root.right=TreeNode(nums[i+1])
a.append(root.right)
i+=2
root=a.pop(0)
return b
root = list_to_binarytree([1,None,2,3,None,4,5,6,7,8])
class Solution:
def hasPathSum(self, root: TreeNode, targetSum: int) -> bool:
#在此填写代码
print(Solution().hasPathSum(list_to_binarytree([5,4,8,11,None,13,4,7,2,None,None,None,1]),22))
print(Solution().hasPathSum(list_to_binarytree([1,2,3]),5))
print(Solution().hasPathSum(list_to_binarytree([1,2]),0))
2 解题思路
可以使用反向思路,用总长度减去当前根节点的值,若结果等于某条树枝的长度就可以返回True
判断结果是否等于某条树枝的长度,可以再是用原函数,树变为根节点的左或右子树,数值变为减去根节点后剩下的值,递归
只要有路径长度为数值,则可返回True,所以对于所有的叶子结点,用or来判断,若其中一个为True,则返回True
3 解题方法
from typing import List
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def list_to_binarytree(nums):
if nums==[]:return
b=root=TreeNode(nums[0])
a=[]
i=1
while i < len(nums):
if nums[i]:
root.left=TreeNode(nums[i])
a.append(root.left)
if i+1<len(nums):
if nums[i+1]:
root.right=TreeNode(nums[i+1])
a.append(root.right)
i+=2
root=a.pop(0)
return b
class Solution:
def hasPathSum(self, root: TreeNode, targetSum: int) -> bool:
if not root:
return False
targetSum-=root.val
if not(root.right or root.left) and targetSum==0:
return True
else:
return self.hasPathSum(root.right,targetSum) or \
self.hasPathSum(root.left,targetSum)
print(Solution().hasPathSum(list_to_binarytree([5,4,8,11,None,13,4,7,2,None,None,None,1]),22))
print(Solution().hasPathSum(list_to_binarytree([1,2,3]),5))
print(Solution().hasPathSum(list_to_binarytree([1,2]),0))
第1-26,36-38行: 题目中已经给出的信息,运行代码时要根据这些代码进行编辑(具体为创建二叉树以及列表、二叉树转换)
第27-28行: 若遍历到None的节点还未等于targetSum,则返回False
第29行: 将targetSum减去当前节点的值,用于判断其左右子树的长度是否满足题意
第30-31行: 当遍历到叶子结点且targetSum的值刚好为0时,返回True
第32-34行: 若不能返回True,则判断左右子树是否有满足题意的叶子结点
代码运行结果为:
结构讲解
这里用到了基础结构:二叉树,简单讲解下这个二叉树:
链表
二叉树(Binary tree)是树形结构的一个重要类型。
许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。
二叉树特点是每个结点最多只能有两棵子树,且有左右之分。
结点:包含一个数据元素及若干指向子树分支的信息
结点的度:一个结点拥有子树的数目称为结点的度
叶子结点:也称为终端结点,没有子树的结点或者度为零的结点
分支结点:也称为非终端结点,度不为零的结点称为非终端结点
树的度:树中所有结点的度的最大值
结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层
树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度
有序树:如果树中各棵子树的次序是有先后次序,则称该树为有序树
序树:如果树中各棵子树的次序没有先后次序,则称该树为无序树
森林:由m(m≥0)棵互不相交的树构成一片森林。如果把一棵非空的树的根结点删除,则该树就变成了一片森林,森林中的树由原来根结点的各棵子树构成
小思考:
小伙伴们知不知道第三行的\有什么作用呢?
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!