每日一題 路徑總和的變體

2021-10-10 03:07:54 字數 1805 閱讀 7961

題目描述

給定乙個二叉樹,它的每個結點都存放著乙個整數值。

找出路徑和等於給定數值的路徑總數。

路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。

示例

返回 3。和等於 8 的路徑有:

5 -> 3

5 -> 2 -> 1

-3 -> 11

思路1強遍歷,對所有節點,以該節點為起點,遍歷其所有子節點,求路徑和等於sum的個數,時間複雜度o(n^2)。

**

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...