(python版)《劍指Offer》JZ24:二叉樹中和為某一值的路徑

龍共日堯發表於2020-12-05

本系列文章為《劍指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 = 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

相關文章