一. 樹的問題首先想到的就是遞迴.先放上自己的思路.
二. 參考大神的思路.
方法 1:遞迴
1. 最直接的方法就是利用遞迴,遍歷整棵樹:如果當前節點不是葉子,對它的所有孩子節點,遞迴呼叫 haspathsum 函式,其中 sum 值減去當前節點的權值;如果當前節點是葉子,檢查 sum 值是否為 0,也就是是否找到了給定的目標和。
複雜度分析
1. 時間複雜度:我們訪問每個節點一次,時間複雜度為 o(n) ,其中 n 是節點個數。
2. 空間複雜度:最壞情況下,整棵樹是非平衡的,例如每個節點都只有乙個孩子,遞迴會呼叫 n 次(樹的高度),因此棧的空間開銷是 o(n) 。但在最好情況下,樹是完全平衡的,高度只有 log(n),因此在這種情況下空間複雜度只有 o(log(n)) 。
方法 2:迭代
1. 我們可以用棧將遞迴轉成迭代的形式。深度優先搜尋在除了最壞情況下都比廣度優先搜尋更快。最壞情況是指滿足目標和的 root->leaf 路徑是最後被考慮的,這種情況下深度優先搜尋和廣度優先搜尋代價是相同的。
2. 利用深度優先策略訪問每個節點,同時更新剩餘的目標和。
3. 所以我們從包含根節點的棧開始模擬,剩餘目標和為 sum - root.val。
4. 然後開始迭代:彈出當前元素,如果當前剩餘目標和為 0 並且在葉子節點上返回 true;如果剩餘和不為零並且還處在非葉子節點上,將當前節點的所有孩子以及對應的剩餘和壓入棧中。
複雜度分析
時間複雜度:和遞迴方法相同是 o(n)。
空間複雜度:當樹不平衡的最壞情況下是 o(n) 。在最好情況(樹是平衡的)下是 o(logn)。
LeetCode112 路徑總和
給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和sum 22,5 48 1113 4 721返回true,因為存在目標和為 22 的根節點到葉子節點的路徑5 4 11 2。遍...
LeetCode 112 路徑總和
給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,5 4 8 11 13 4 7 2 1 返回 true,因為存在目標和為 22 的根節點到葉子節點的路徑 5 ...
Leetcode 112 路徑總和
給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和sum 22,5 48 1113 4 721 返回true,因為存在目標和為 22 的根節點到葉子節點的路徑5 4 11 2。...