給定二叉樹和乙個常數sum,求二叉樹中路徑和等於sum的所有路徑個數,這些路徑可以是任意起點和終點,但必須是按照從父節點到子節點的路徑
方法一:強遍歷,對所有節點,以該節點為起點,遍歷其所有子節點,求路徑和等於sum的個數,時間複雜度o(n^2)。
public int pathsum(treenode root, int sum)
public int countpath(treenode root, int sum)
方法二:使用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的只有乙個節點。
presum.put(currsum, presum.get(currsum) - 1); //注意在返回時,要把presum中到達當前節點的路徑和的個數減一
return res;
}方法三:遞迴的時候,考慮從當前節點起始,或者繼承祖先節點的和(實際上時間複雜度比第一種方法還大)
public class solution
public int pathsumhelper(treenode root, int sum, boolean hasparent)
二叉樹路徑和
二叉樹中和為某一值的路徑 輸入一棵二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。示例 給定如下二叉樹,以及目標和sum 22,5 4 8 11 13 4 7 2 5 1返回 5,4,11,2 5,8,4,5 public l...
二叉樹 路徑
二叉樹中,從根節點到葉節點的每一條連線,我們稱之為路徑,最短路徑和最長路徑在之前的部落格中,我們已經完成了對他們的討論,現在我們討論一下,輸出一棵二叉樹中全部的路徑資訊。如下所示 public class operation childbinarytreepath root,return resul...
二叉樹路徑和問題
今天回顧了一下二叉樹給定sum的問題,邏輯還是有問題,本以為對的,寫了如下的 bool haspathsum treenode root,int sum if path sum return true p s.top s.pop if p left null path p left val p p ...