博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(python版)《剑指Offer》JZ24:二叉树中和为某一值的路径
阅读量:4091 次
发布时间:2019-05-25

本文共 1424 字,大约阅读时间需要 4 分钟。

本系列文章为《剑指Offer》刷题笔记。

刷题平台:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

回溯法按 深度优先策略 搜索问题的解空间树。

.
首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。
.
如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。

解题图示

  1. 当完成第一颗子树(根 到 叶子节点)的遍历,变量值如下图所示
    在这里插入图片描述
    在7节点 的这一轮,得到 tar = -5, 无root.left,也无root.right,就把7 pop出去(从path列表中删去)
  2. 如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯
    !然后回溯到第三层,节点11的左子树7搜索完毕,到了右子树2。
    满足以下条件:
    ①它是叶子节点;
    ②该路径path总和等于 目标值
    则把该路径path 加入res 列表中
    在这里插入图片描述
  3. [5, 8, 13] 不满足条件
    [5, 8, 4, 5] 满足条件,则把该路径path 加入res 列表中
    [5, 8, 4, 1] 不满足条件
    在这里插入图片描述
    在这里插入图片描述
class TreeNode:    def __init__(self, x):        self.val = x        self.left = None        self.right = Noneclass Solution:    # 返回二维列表,内部每个列表表示找到的路径    def pathSum(self, root, sum):        res, path = [], []        def recur(root, tar):            if not root: return            path.append(root.val)            tar -= root.val            if tar == 0 and not root.left and not root.right:                res.append(list(path))                            recur(root.left, tar)            recur(root.right, tar)            path.pop()        recur(root, sum)        return res

注:

1. if 满足条件的判断:既是叶子节点,又使该路径path总和等于 目标值
2. 记录路径时若直接执行 res.append(path) ,则是将此 path 对象加入了 res ;后续 path 改变时, res 中的 path 对象也会随之改变,因此无法实现结果记录,故res.append(list(path))
3. 向上回溯前,需要将当前节点从路径 path 中删除,即执行 path.pop(). pop()默认是删最后一个节点,并返回该值。所以不用在里面加下标,要写的话,写-1

https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5dc8rr/

https://blog.csdn.net/jarvischu/article/details/16067319

你可能感兴趣的文章
【Lua】Mac系统下配置SublimeText的Lua编译环境
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
【Unity】微信登录后将头像存为bytes,将bytes读取成sprite图片
查看>>
【Unity】使用GPS定位经纬度
查看>>
【UGUI/NGUI】一键换Text/Label字体
查看>>
【C#】身份证本地验证
查看>>
【Unity】坑爹的Bug
查看>>
【算法】求数组中某两个数的和为目标值
查看>>
如何高效学习动态规划?
查看>>
动态规划法(六)鸡蛋掉落问题(一)
查看>>
LeetCode 887.鸡蛋掉落(C++)
查看>>
Dijkstra‘s algorithm (C++)
查看>>
奇异值分解(SVD)的原理详解及推导
查看>>
算法数据结构 思维导图学习系列(1)- 数据结构 8种数据结构 数组(Array)链表(Linked List)队列(Queue)栈(Stack)树(Tree)散列表(Hash)堆(Heap)图
查看>>
求LCA最近公共祖先的离线Tarjan算法_C++
查看>>
Leetcode 834. 树中距离之和 C++
查看>>
【机器学习】机器学习系统SysML 阅读表
查看>>
最小费用最大流 修改的dijkstra + Ford-Fulksonff算法
查看>>
最小费用流 Bellman-Ford与Dijkstra 模板
查看>>
实现高性能纠删码引擎 | 纠删码技术详解(下)
查看>>