這是悅樂書的第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 小結
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!