【面試題 04.12】 求和路徑

題目

題目鏈接

給定一棵二叉樹,其中每個節點都含有一個整數數值(該值或正或負)。設計一個算法,打印節點數值總和等於某個給定值的所有路徑的數量。注意,路徑不一定非得從二叉樹的根節點或葉節點開始或結束,但是其方向必須向下(只能從父節點指向子節點方向)。
示例:
給定如下二叉樹,以及目標和 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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章