
技術提高是一個循序漸進的過程,所以我講的leetcode算法題從最簡單的level開始寫的,然后到中級難度,最后到hard難度全部完。
目前我選擇C語言,Python和Java作為實現語言,因為這三種語言還是比較典型的。由于篇幅和精力有限,其他語言的實現有興趣的朋友請自己嘗試。
初級難度說的差不多的時候,我打算再加點其他內容,我可能會從操作系統到協議棧,從分布式聊到大數據框架,從大數據聊到人工智能,... ...。
如果有任何問題可以在文章后評論或者私信給我。
我會持續分享下去,敬請您的關注。
LeetCode 404. 左葉子之和(Sum of Left Leaves)
問題描述:
計算給定二叉樹的所有左葉子之和。
示例:

C語言實現:
我們知道求所有葉子節點的方法,是遞歸的將左右子樹的葉子節點值相加。
這道題只是在此基礎上增加了一個條件而已,即需要加一個判斷以確定一個葉子節點是否是左葉子節點。
這里我們有兩種方法。
第一種方法:
直接判斷是否是左葉子節點,如果是,那么返回它的值與右邊兄弟節點遞歸的結果的和,因為它的兄弟節點不一定是葉子節點,所以還要遞歸。
如果某節點的左右節點都不是葉子節點,那么就返回其左右節點遞歸的和,這個很容易理解。
代碼如下:

第二種方法:
這需要定義一個新的遞歸函數,使得在遍歷的時候標記接下來的節點是否是左節點。
如果下面要遍歷的節點是當前節點的左節點,那么除了將左節點傳遞給新函數外,還有傳遞一個true值給新函數,以標記這是一個左節點,同樣的,如果是右節點,傳遞右節點和一個false給新函數。那么新函數在做處理的時候,首先看傳過來的參數,如果標記這是一個左節點,那么返回它的值。否則繼續遞歸該節點的子節點并返回他們的和。
代碼如下:

從代碼來看這兩種實現都很類似,但是原理是有些不同的。
他們的算法復雜度是相同的,性能上的表現也基本一致。

python語言的實現:
python的實現用的是第一種方式,第二種方式,讀者自行嘗試。
代碼如下:


Java語言的實現:
Java 的實現用的是第一種方式,第二種方式,讀者自行嘗試。
代碼如下:

