(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】二叉樹中和為某一值的路徑二叉樹
- 劍指 Offer 34. 二叉樹中和為某一值的路徑二叉樹
- 劍指 Offer 34. 二叉樹中和為某一值的路徑(java解題)二叉樹Java
- 面試題34:二叉樹中和為某一值的路徑面試題二叉樹
- JZ-024-二叉樹中和為某一值的路徑二叉樹
- 劍指offer——重建二叉樹二叉樹
- 【劍指offer】二叉樹深度二叉樹
- 劍指offer(四)重建二叉樹二叉樹
- 劍指Offer-40-二叉樹的深度二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 《劍指offer》:[59]對稱的二叉樹二叉樹
- 《劍指offer》:[39]求解二叉樹的深度二叉樹
- 劍指 Offer 07. 重建二叉樹二叉樹
- 【劍指offer】判斷二叉樹平衡二叉樹
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- [劍指offer] 把二叉樹列印成多行二叉樹
- 《劍指offer》:[62]序列化二叉樹二叉樹
- 《劍指offer》:[41]陣列中和為S的兩個數陣列
- 《劍指offer》:[66]矩陣中的路徑矩陣
- 《劍指offer》:[39-1]判斷是否為平衡二叉樹二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- 《劍指offer》:[60]把二叉樹列印成多行二叉樹
- 【劍指offer】從上向下列印二叉樹二叉樹
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 《劍指offer》:[58]二叉樹的下一個結點二叉樹
- 劍指offer(C++)——把二叉樹列印成多行C++二叉樹
- 劍指offer:JZ12 矩陣中的路徑矩陣
- 【劍指offer】樹的子結構
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- 《劍指offer》之在完全二叉樹中新增子節點二叉樹
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 《劍指offer》:[61]按之字形順序列印二叉樹二叉樹
- 劍指Offer 表示數值的字串字串
- 劍指 Offer 12-矩陣中的路徑c++矩陣C++