天天看點

二叉樹中的和為某一值的路徑

一,問題描述

給定一棵二叉樹 和 一個整數,列印出二叉樹中結點值的和為給定的整數的所有路徑。注意:路徑是指:從二叉樹的根結點開始的,往下一直到葉子結點過程中 所經過的結點(包括根結點(起點)和葉子結點(終點))。

二,算法分析

應用了遞歸的先序周遊。先序周遊每個結點,将先序周遊的每個結點的和相加,相加的結果是給定的整數,則找到一條路徑并列印之。

定義一個整型變量currentSum,儲存目前通路到的路徑上的結點之和;定義一個棧用來儲存目前的路徑。為什麼用棧?因為這樣可以與遞歸的先序周遊同步。

用了棧之後,如何列印路徑?JAVA的LinkedList類的 descendingIterator()方法傳回一個可以逆序周遊連結清單的疊代器。

結點中的值,即可以為正數 也可以為負數嗎?答案是可以。因為,路徑必須是從根到葉子結點,且整個遞歸調用會一直調用到葉子後才會傳回。

代碼實作如下:

二叉樹中的和為某一值的路徑
二叉樹中的和為某一值的路徑

可以看出:上面的代碼是一個二叉樹的先序周遊的典型應用!第9,10行表示:通路根結點[然後進行了一系列的處理(12-19行)];第21、22行表示通路根的左子樹;第23、24行表示通路根的右子樹。

當周遊到葉子結點時,在第26行,儲存路徑的棧會 pop,這相當于路徑的回退。

三,擴充

如果給定的樹中的結點值都是正數,且路徑隻需要從根結點開始,路徑的終點不一定是葉子結點

這裡,當currentSum > expectedSum時,就不需要再向下進行遞歸調用了。因為,結點值都是正數,再向下遞歸調用隻會是currentSum越來越大。

比如,expectedSum為 13,當周遊到結點6時,currentSum=8+6=14 了,就不需要再向下進行周遊了。

二叉樹中的和為某一值的路徑

如果expectedSum=14,那麼周遊到6之後,也不需要再向下周遊了。總之,隻有當currentSum 小于 expectedSum時,才需要向下進行周遊。代碼實作如下:

二叉樹中的和為某一值的路徑
二叉樹中的和為某一值的路徑

完整代碼如下:

二叉樹中的和為某一值的路徑