c#二叉树 取叶子节点个数_两种类似但是原理不同的算法求二叉树的所有叶子节点和...
技術(shù)提高是一個(gè)循序漸進(jìn)的過程,所以我講的leetcode算法題從最簡(jiǎn)單的level開始寫的,然后到中級(jí)難度,最后到hard難度全部完。
目前我選擇C語言,Python和Java作為實(shí)現(xiàn)語言,因?yàn)檫@三種語言還是比較典型的。由于篇幅和精力有限,其他語言的實(shí)現(xiàn)有興趣的朋友請(qǐng)自己嘗試。
初級(jí)難度說的差不多的時(shí)候,我打算再加點(diǎn)其他內(nèi)容,我可能會(huì)從操作系統(tǒng)到協(xié)議棧,從分布式聊到大數(shù)據(jù)框架,從大數(shù)據(jù)聊到人工智能,... ...。
如果有任何問題可以在文章后評(píng)論或者私信給我。
我會(huì)持續(xù)分享下去,敬請(qǐng)您的關(guān)注。
LeetCode 404. 左葉子之和(Sum of Left Leaves)
問題描述:
計(jì)算給定二叉樹的所有左葉子之和。
示例:
C語言實(shí)現(xiàn):
我們知道求所有葉子節(jié)點(diǎn)的方法,是遞歸的將左右子樹的葉子節(jié)點(diǎn)值相加。
這道題只是在此基礎(chǔ)上增加了一個(gè)條件而已,即需要加一個(gè)判斷以確定一個(gè)葉子節(jié)點(diǎn)是否是左葉子節(jié)點(diǎn)。
這里我們有兩種方法。
第一種方法:
直接判斷是否是左葉子節(jié)點(diǎn),如果是,那么返回它的值與右邊兄弟節(jié)點(diǎn)遞歸的結(jié)果的和,因?yàn)樗男值芄?jié)點(diǎn)不一定是葉子節(jié)點(diǎn),所以還要遞歸。
如果某節(jié)點(diǎn)的左右節(jié)點(diǎn)都不是葉子節(jié)點(diǎn),那么就返回其左右節(jié)點(diǎn)遞歸的和,這個(gè)很容易理解。
代碼如下:
第二種方法:
這需要定義一個(gè)新的遞歸函數(shù),使得在遍歷的時(shí)候標(biāo)記接下來的節(jié)點(diǎn)是否是左節(jié)點(diǎn)。
如果下面要遍歷的節(jié)點(diǎn)是當(dāng)前節(jié)點(diǎn)的左節(jié)點(diǎn),那么除了將左節(jié)點(diǎn)傳遞給新函數(shù)外,還有傳遞一個(gè)true值給新函數(shù),以標(biāo)記這是一個(gè)左節(jié)點(diǎn),同樣的,如果是右節(jié)點(diǎn),傳遞右節(jié)點(diǎn)和一個(gè)false給新函數(shù)。那么新函數(shù)在做處理的時(shí)候,首先看傳過來的參數(shù),如果標(biāo)記這是一個(gè)左節(jié)點(diǎn),那么返回它的值。否則繼續(xù)遞歸該節(jié)點(diǎn)的子節(jié)點(diǎn)并返回他們的和。
代碼如下:
從代碼來看這兩種實(shí)現(xiàn)都很類似,但是原理是有些不同的。
他們的算法復(fù)雜度是相同的,性能上的表現(xiàn)也基本一致。
python語言的實(shí)現(xiàn):
python的實(shí)現(xiàn)用的是第一種方式,第二種方式,讀者自行嘗試。
代碼如下:
Java語言的實(shí)現(xiàn):
Java 的實(shí)現(xiàn)用的是第一種方式,第二種方式,讀者自行嘗試。
代碼如下:
總結(jié)
以上是生活随笔為你收集整理的c#二叉树 取叶子节点个数_两种类似但是原理不同的算法求二叉树的所有叶子节点和...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django项目如何连接前端_工作笔记前
- 下一篇: C#调用python文件