LeetCode算法題-Path Sum(Java實現)

這是悅樂書的第169次更新,第171篇原創

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第28題(順位題號是112)。給定二叉樹和整數sum,確定樹是否具有根到葉路徑,使得沿路徑的所有值相加等於給定的sum。葉子節點是沒有子節點的節點。例如:

給定以下二叉樹和sum = 22,

            5
          /   \
         4     8
        /     /  \
      11     13   4
     / \           \
    7   2           1

返回true,因爲存在根到葉的路徑5-> 4-> 11-> 2,並且和爲22。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

特殊情況一:當二叉樹爲空時,直接返回false。

特殊情況二:當二叉樹只有一個節點時,即此節點爲根節點,並且節點值等於sum,返回true。

正常情況:對於此題,遍歷二叉樹的節點時,需要使用深度優先的算法,我們可以藉助遞歸,並且上面兩種特殊情況也是遞歸的終止條件。對於從根節點進來的左右子樹,可以同時進行遞歸,每次對相應的節點做減法,直到滿足上面的特殊情況二爲止。

public boolean hasPathSum(TreeNode root, int sum) {
    if(root == null ){
        return false;
    }
    if (root.left == null && root.right == null && (sum - root.val) == 0) {
        return true;
    }
    return hasPathSum(root.left, sum-root.left.val) || hasPathSum(root.right, sum-root.right.val);
}


03 第二種解法

除了上面的遞歸,我們是否可以用迭代的方法呢?答案是可以的。

因爲還是需要滿足深度優先,所以我們單獨使用了一個隊列來放每條路徑上的各節點之和,在每次取出一個節點的時候,同時取出一個和來,判斷此節點是否爲葉子節點並且判斷和是否等於sum。

public boolean hasPathSum2(TreeNode root, int sum) {
    if(root == null ){
        return false;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    Queue<Integer> sums = new LinkedList<>();
    queue.offer(root);
    sums.offer(root.val);
    while(!queue.isEmpty()) {
        TreeNode t = queue.poll();
        int temSum = sums.poll();
        if (t.left == null && t.right == null && temSum == sum) {
            return true;
        }
        if (t.left != null) {
            queue.offer(t.left);
            sums.offer(temSum + t.left.val);
        }
        if (t.right != null) {
            queue.offer(t.right);
            sums.offer(temSum + t.right.val);
        }
    }
    return false;
}


04 小結

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章