Featured image of post 從LeetCode學演算法 - 99 Tree (14) / DFS (11)

從LeetCode學演算法 - 99 Tree (14) / DFS (11)

0404. Sum of Left Leaves (Easy)

寫在前面

容筆者工商一下,
「從Leetcode學演算法|進階篇」 開放預購啦!
這次選了40道難度加深的LeetCode題目,
同樣也會細部解說對應的技巧及須要掌握的演算法!
同時這次購買進階篇的話,
額外還加贈**「從Leetcode學演算法|面試篇」** !
當中包含了面試準備須知分享及訪談國內外不同經驗的工程師
讓你不論是想走前端/後端/一般軟工 或者是想找國外的工作
初學想轉職 還是正在工作 ,都能夠從中得到收穫呦!
有興趣的朋友可以使用下面的早鳥優惠~
「從Leetcode學演算法|進階篇」+「從Leetcode學演算法|面試篇」
https://bit.ly/advleetcode

「從Leetcode學演算法」全套(基礎/進階/面試篇)同捆優惠:
https://bit.ly/allleetcode

Question

Find the sum of all left leaves in a given binary tree.

Example:

1
2
3
4
5
    3
   / \
  9  20
    /  \
   15   7
1
There are two left leaves in the binary tree, with values 9 and 15 respectively. Return 24.

分析/解題

給定一個二元樹,試求所有左葉子的總和。

我們很久以前有提過二元樹的定義,
忘記的話,請再複習一下XD
而葉子的定義,就是它左右都沒有連接節點(NIL)!

這時候,你可能會說:
我知道,那我只要一直往左邊看就好啦!

呃……同學,你忘記了你的右子樹也可能產生左葉子 嗎XD?
範例中的15,不就是先從3的右節點20,
再往左節點來到15所得到的嗎?

那怎麼辦呢?
所以我們在檢查所在節點是不是葉子的時候,
還需要看看這個節點是不是從它的根節點往左邊走下來 的。
因此,我們可以每次分支往左右走,給出一個參數from,
分別給往左子樹走的函式1,給右子樹走的函式-1
用來代表下一層的時候拿來判定是不是左葉子的前置依據。

當我們看到from == 1且左右節點均為NIL時,
就可以將當前的節點值回傳,
否則的話,就繼續遞迴往下找底下子樹當中左葉的和。

依此,寫成程式碼如下:

Java

Java的部分,每次先檢查root是否為null,
接著我們的答案就用
sumOfLeftLeaves(root.left, 1) + sumOfLeftLeaves(root.right, -1)
來取得。
其他的寫法概念如前所述。

Python

Python的部分寫一個子函式,因為這邊沒有用self,
所以可以不用self.getSum來算。
(也可以把add設定預設値-1,
使用單個sumOfLeftLeaves來解此題,
這個化簡方式很簡單,就留給讀者來練習看看XD)

面試實際可能會遇到的問題

「時間/空間複雜度?」
(O(N)/O(1),因為要經過每個節點,
而如果考慮call stack的話,
空間複雜度會是O(depth of Tree))

相似及延伸

0235. Lowest Common Ancestor of a Binary Search Tree (Easy)

Special Thanks suggestions/corrections from viewers:
(歡迎提供意見協助更正歐~)

從LeetCode學演算法,我們下次見囉,掰~

另外,「從Leetcode學演算法|基礎篇」 已經回原價囉,
先前的優惠碼會失效,但這邊仍然為讀者保留了300塊的折抵,
雖然整捆一起買總體比較划算 (差290而已就有整組了阿XD),
如果你還是想先試試基礎課的話,
300元折抵的連結 在這邊:
https://bit.ly/1desolve

共發表了 171 篇文章 ‧ 總計 311.6k
使用 Hugo 建立
主題 StackJimmy 設計