(python版)《劍指Offer》JZ24:二叉樹中和為某一值的路徑
本系列文章為《劍指Offer》刷題筆記。
刷題平臺:牛客網
瞭解一下回溯演算法:
回溯法按 深度優先策略 搜尋問題的解空間樹。
.
首先從根節點出發搜尋解空間樹,當演算法搜尋至解空間樹的某一節點時,先利用剪枝函式判斷該節點是否可行(即能得到問題的解)。
.
如果不可行,則跳過對該節點為根的子樹的搜尋,逐層向其祖先節點回溯;否則,進入該子樹,繼續按深度優先策略搜尋。
解題圖示
- 當完成第一顆子樹(根 到 葉子節點)的遍歷,變數值如下圖所示
在7節點 的這一輪,得到 tar = -5, 無root.left,也無root.right,就把7 pop出去(從path列表中刪去) - 如果不可行,則跳過對該節點為根的子樹的搜尋,逐層向其祖先節點回溯
!然後回溯到第三層,節點11的左子樹7搜尋完畢,到了右子樹2。
滿足以下條件:
①它是葉子節點;
②該路徑path總和等於 目標值
則把該路徑path 加入res 列表中
- [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 = None
class 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
相關文章
- 劍指 Offer 34. 二叉樹中和為某一值的路徑二叉樹
- 劍指 Offer 34. 二叉樹中和為某一值的路徑(java解題)二叉樹Java
- JZ-024-二叉樹中和為某一值的路徑二叉樹
- 面試題34:二叉樹中和為某一值的路徑面試題二叉樹
- 劍指offer——重建二叉樹二叉樹
- 劍指offer(四)重建二叉樹二叉樹
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 劍指Offer-40-二叉樹的深度二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 劍指 Offer 07. 重建二叉樹二叉樹
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- [劍指offer] 把二叉樹列印成多行二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 劍指offer:JZ12 矩陣中的路徑矩陣
- [劍指offer] 二叉搜尋樹的後序遍歷序列
- leetcode 102 劍指Offer 32 二叉樹的層次遍歷LeetCode二叉樹
- 劍指 Offer 12-矩陣中的路徑c++矩陣C++
- 力扣 - 劍指 Offer 12. 矩陣中的路徑力扣矩陣
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- 《劍指offer》之在完全二叉樹中新增子節點二叉樹
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 劍指Offer 表示數值的字串字串
- 劍指 Offer 32 - III. 從上到下列印二叉樹 III二叉樹
- 劍指offer-JavaScript版JavaScript
- 劍指 Offer 33. 二叉搜尋樹的後序遍歷序列
- LeetCode 劍指offer——從上到下列印二叉樹 II、從上到下列印二叉樹 IIILeetCode二叉樹
- 用 Go 劍指 Offer 12. 矩陣中的路徑 (DFS + 回溯)Go矩陣
- 劍指offer面試題12:矩陣中的路徑(Java版已在牛客網AC)面試題矩陣Java
- 劍指offer-17:樹的子結構
- 劍指 Offer 54. 二叉搜尋樹的第k大節點 mark
- 劍指Offer系列之「表示數值的字串」字串
- 劍指offer(java實現)第4題“重建二叉樹”-牛客網Java二叉樹
- 【劍指offer】【4】根據前序和中序結果,重建二叉樹二叉樹
- 劍指 Offer 32 - I. 從上到下列印二叉樹(java解題)二叉樹Java