題目
給定一棵二叉樹,其中每個節點都含有一個整數數值(該值或正或負)。設計一個算法,打印節點數值總和等於某個給定值的所有路徑的數量。注意,路徑不一定非得從二叉樹的根節點或葉節點開始或結束,但是其方向必須向下(只能從父節點指向子節點方向)。
示例:
給定如下二叉樹,以及目標和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
3
解釋:和爲 22 的路徑有:[5,4,11,2], [5,8,4,5], [4,11,7]
提示:
節點總數 <= 10000
實現思路
首先他說路徑不一定是從二叉樹的根節點開始或葉子節點結束,但是方向必須向下,所以就由根節點出發向下傳遞。
從根節點出發判斷是否存在滿足的路徑,後從根節點的左孩子出發判斷是否存在滿足的路徑,接着再從根節點的右孩子出發判斷是否存在滿足的路徑。
雙遞歸!搞定收工。
代碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int temp = 0;
public int pathSum(TreeNode root, int sum) {
if (root == null) return 0;
//以當前節點作爲頭結點的路徑
solve(root, sum);
//以當前節點的左孩子作爲頭結點的路徑
pathSum(root.left, sum);
//以當前節點的右孩子作爲頭結點路徑
pathSum(root.right, sum);
return temp;
}
public void solve(TreeNode root, int sum) {
//前序遍歷
if (root == null) {
return;
}
sum -= root.val;
//找到符合的 總數+1
if (sum == 0) {
temp++;
}
solve(root.left, sum);
solve(root.right, sum);
}
}