page contents

python基础编程100例:第59期-基础结构:二叉树 路径总和

本文讲述了python基础编程100例:第59期-基础结构:二叉树 路径总和!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-03-G316D3Kq623d19f4e8781.png

本文讲述了python基础编程100例:第59期-基础结构:二叉树 路径总和!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

第59期-基础结构:二叉树 路径总和

1 问题描述

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。


示例 1:

attachments-2022-03-Idg30EEx623d19cd2030e.png

输入: root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22

输出: true


示例 2:

attachments-2022-03-e6CK3NFc623d19c2c5873.png

输入: 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,则判断左右子树是否有满足题意的叶子结点


代码运行结果为:

attachments-2022-03-5HwxVfUU623d19a86dc89.png

结构讲解

这里用到了基础结构:二叉树,简单讲解下这个二叉树:

链表

二叉树(Binary tree)是树形结构的一个重要类型。

许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。

attachments-2022-03-XWDP1b0t623d199dc1333.png

二叉树特点是每个结点最多只能有两棵子树,且有左右之分。

结点:包含一个数据元素及若干指向子树分支的信息

结点的度:一个结点拥有子树的数目称为结点的度

叶子结点:也称为终端结点,没有子树的结点或者度为零的结点

分支结点:也称为非终端结点,度不为零的结点称为非终端结点

树的度:树中所有结点的度的最大值

结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层

树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度

有序树:如果树中各棵子树的次序是有先后次序,则称该树为有序树

序树:如果树中各棵子树的次序没有先后次序,则称该树为无序树

森林:由m(m≥0)棵互不相交的树构成一片森林。如果把一棵非空的树的根结点删除,则该树就变成了一片森林,森林中的树由原来根结点的各棵子树构成

小思考:

小伙伴们知不知道第三行的\有什么作用呢?

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-PBswuixv62b3c8900700f.jpeg

  • 发表于 2022-03-25 09:25
  • 阅读 ( 462 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章