題目描述
給定乙個二叉樹,它的每個結點都存放著乙個整數值。
找出路徑和等於給定數值的路徑總數。
路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。
二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。
示例思路1強遍歷,對所有節點,以該節點為起點,遍歷其所有子節點,求路徑和等於sum的個數,時間複雜度o(n^2)。返回 3。和等於 8 的路徑有:
5 -> 3
5 -> 2 -> 1
-3 -> 11
**
public
intpathsum
(treenode root,
int sum)
//countpath為計算從這個點出發,所有可能使得節點和為sum的路徑數
public
intcountpath
(treenode root,
int sum)
思路2使用hashmap,儲存根節點到達所有父節點的路徑和及其個數,時間複雜度為o(n)。
計算從根節點到當前節點的和currsum,如果presum中存在元素等於currsum - target,假設從根節點到其祖先節點k的路徑和等於currsum - target,那麼從k節點的子節點到當前節點的路徑和就是target。例如上面的二叉樹,假設當前節點為3,target = 8,那麼presum中會儲存所有祖先節點與根節點的距離和個數:<10,1>, <15,1>。此時,currsum = 18,presum中存在10 = currsum - target,因此從10的子節點5到當前節點3的路徑和就剛好是8。presum的value記錄了這樣的距離的個數,因此,到達3這個節點路徑和為8的只有乙個節點。
**
public
intpathsum
(treenode root,
int sum)
public
inthelper
(treenode root,
int currsum,
int target, hashmap
presum)
currsum += root.val;
int res += presum.
getordefault
(currsum - target,0)
; presum.
put(currsum, presum.
getordefault
(currsum,0)
+1);
res +=
helper
(root.left, currsum, target, presum)
+helper
(root.right, currsum, target, presum)
; presum.
put(currsum, presum.
get(currsum)-1
);//注意在返回時,要把presum中到達當前節點的路徑和的個數減一
return res;
}
每日一題 路徑總和
題目描述 給定乙個二叉樹和乙個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,返回 5,4,11,2 5,8,4,5 思路dfs 前序遍歷 遞迴 用乙個path來存放路徑,每次將當前節點值新增到路徑中...
LeetCode每日一題 路徑總和
題目 給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,5 4 8 11 13 4 7 2 1 返回 true,因為存在目標和為 22 的根節點到葉子節點的路徑...
(力扣每日一題)路徑總和
給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。解題思路 1 使用廣度優先搜尋的方式,記錄從根節點到當前節點的路徑和。2 使用兩個佇列,分別儲存將要遍歷的節點,以及根節點到這些節點的路徑和。class so...