[easy+][Tree][review]257.Binary Tree Paths

原題是:

Screen Shot 2017-11-08 at 10.47.56 AM.png

思路是:

這個(gè)題前面所有題的不同之處在于亮钦,從上到下的過程中,需要上一層的值充活,
所以把上一層的值作為參數(shù)傳入迭代函數(shù)蜂莉。
這里本來作為參數(shù)傳入的只有strs,而ans 嘗試作為class變量,或者作為成員函數(shù)變量混卵,都不可行映穗,所以干脆也作為參數(shù)傳入迭代函數(shù),可以保證之前的值不丟失。
(后面發(fā)現(xiàn)作為ans作為helper函數(shù)的變量是可以的)
總之幕随,下面的節(jié)點(diǎn)蚁滋,需不需要上面的信息,是函數(shù)參數(shù)是否帶入上一步結(jié)果的標(biāo)準(zhǔn)合陵。

代碼是:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    #ans = []  ----try one 寫在這里的話枢赔,對(duì)不同的樹所得到的所有結(jié)果都在ans中,
    #因?yàn)槭穷愖兞俊?    def binaryTreePaths(self, root):
        """
        :type root: TreeNode
        :rtype: List[str]
        """
        strs =""
        ans =[]
        if root == None:
            return []
        else :
            return self.helper(root,strs,ans)
            
        
    def helper(self,root,strs,ans):
        #ans = [] 下一次調(diào)用helper時(shí)拥知,前一次的結(jié)果就被清空了踏拜。
        if root == None:
            return ans
        if root and not(root.left or root.right):
            if not strs:
                ans.append(str(root.val))
            else:
                ans.append(strs + "->" + str(root.val))
        
        else:
            strs = strs + "->" + str(root.val) if strs else str(root.val)
            self.helper(root.left, strs, ans)
            self.helper(root.right, strs, ans)
        
        return ans

反思:

對(duì)比一下他人的代碼,并修改了我自己的代碼低剔,發(fā)現(xiàn)了我在遞歸類代碼中常犯的一類錯(cuò)誤:
首先上別人的代碼(感謝李穎友情贊助他的代碼):

class Solution(object):
    def helper(self, root, path): #---他思路傳入?yún)?shù)的Path已經(jīng)包含了調(diào)用函數(shù)的當(dāng)前#節(jié)點(diǎn)速梗,這點(diǎn)不重要
        res = []   #-----重要的是,每層調(diào)用helper函數(shù)的節(jié)點(diǎn)襟齿,都有一個(gè)自己的res
                     #但是他 “回收”了上一層helper函數(shù)返回給這一層helper的res
        if not root.left and not root.right:
            res.append(path)
            return res
        if root.left:
            lpath = path + '->' + str(root.left.val)
            res += self.helper(root.left, lpath)  #-----一個(gè)list + 另一個(gè)list = 一個(gè)合并了元
#素的List
        if root.right:
            rpath = path + '->' + str(root.right.val)
            res += self.helper(root.right, rpath)
        return res
       
def binaryTreePaths(self, root):
        """
        :type root: TreeNode
        :rtype: List[str]
        """
        if not root:
            return []
        path = str(root.val)
        return self.helper(root, path)

對(duì)比我的第一個(gè)版代碼姻锁,我的上一層helper函數(shù)做了工作之后,沒有在該層回收
所以導(dǎo)致最終的ans是空[]猜欺。

因此位隶,我如果按照他的思路,修改自己的代碼如下:

class Solution:
    
    def binaryTreePaths(self, root):
        """
        :type root: TreeNode
        :rtype: List[str]
        """
        strs =""
        #ans =[]
        if root == None:
            return []
        else :
            #return self.helper(root,strs,ans)
            return self.helper(root,strs)    
        
    #def helper(self,root,strs,ans):
    def helper(self,root,strs):
        ans = []
        if root == None:
            return ans
        if root and not(root.left or root.right):
            if not strs:
                ans.append(str(root.val))
            else:
                ans.append(strs + "->" + str(root.val))
        
        else:
            strs = strs + "->" + str(root.val) if strs else str(root.val)
            #self.helper(root.left, strs, ans)
            #self.helper(root.right, strs, ans)
            ans += self.helper(root.left,strs)
            ans += self.helper(root.right,strs)
        
        return ans

回想leetcode669开皿,
我同樣是犯了“沒有回收上一層結(jié)果”的錯(cuò)誤涧黄。

5040713-d7904bb15618457c.png

21,28兩行篮昧,沒有像23,24一樣去回收成果笋妥。
對(duì)于測(cè)試?yán)覽3-1-null-2]來說懊昨,范圍是3-4,而錯(cuò)誤代碼春宣,導(dǎo)致結(jié)果是[3-2],
原因是什么呢:
在函數(shù)trimBST處理1這個(gè)節(jié)點(diǎn)時(shí)酵颁,有一個(gè)屬于1節(jié)點(diǎn)的root,他經(jīng)過trim后月帝,指向了2躏惋。但是當(dāng)trimBST下一層,到處理2這個(gè)節(jié)點(diǎn)時(shí)嫁赏,又有一個(gè)屬于2節(jié)點(diǎn)的root其掂,是同名的另一個(gè)存在,這個(gè)root經(jīng)過trim指向了null潦蝇,然而由于沒有用1節(jié)點(diǎn)這一層的root去接收新的root(也就是Null),導(dǎo)致1這一層的root依然指向2節(jié)點(diǎn)款熬。

正確的應(yīng)該是:


5040713-b7c74a079662eea2.png

多一點(diǎn)反思:

如果把669這個(gè)題,設(shè)置所有節(jié)點(diǎn)都在L-R范圍以外(為避免選入無限循環(huán))
在每一層直接返回下一層的結(jié)果攘乒,像這樣:


Screen Shot 2017-11-08 at 10.26.39 PM.png

可以順利的把所有節(jié)點(diǎn)剪光贤牛。
是因?yàn)槊恳淮蜗聦拥姆祷刂担贿@一層接收后则酝,不經(jīng)任何處理殉簸,直接上交上一層。
只有這樣的時(shí)候沽讹,才可以這樣寫代碼般卑,直接返回遞歸函數(shù)的返回值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市爽雄,隨后出現(xiàn)的幾起案子蝠检,更是在濱河造成了極大的恐慌,老刑警劉巖挚瘟,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叹谁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乘盖,警方通過查閱死者的電腦和手機(jī)焰檩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來订框,“玉大人析苫,你說我怎么就攤上這事。” “怎么了衩侥?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵浪腐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我顿乒,道長(zhǎng),這世上最難降的妖魔是什么泽谨? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任璧榄,我火速辦了婚禮,結(jié)果婚禮上吧雹,老公的妹妹穿的比我還像新娘骨杂。我一直安慰自己,他們只是感情好雄卷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布搓蚪。 她就那樣靜靜地躺著,像睡著了一般丁鹉。 火紅的嫁衣襯著肌膚如雪妒潭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天揣钦,我揣著相機(jī)與錄音雳灾,去河邊找鬼。 笑死冯凹,一個(gè)胖子當(dāng)著我的面吹牛谎亩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宇姚,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼匈庭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了浑劳?” 一聲冷哼從身側(cè)響起阱持,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呀洲,沒想到半個(gè)月后紊选,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡道逗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年兵罢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滓窍。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卖词,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情此蜈,我是刑警寧澤即横,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站裆赵,受9級(jí)特大地震影響东囚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜战授,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一页藻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧植兰,春花似錦份帐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筒繁,卻和暖如春噩凹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膝晾。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工栓始, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人血当。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓幻赚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親臊旭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子落恼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)离熏,斷路器佳谦,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 對(duì)我來說钻蔑,事實(shí)就是這樣的。 剛才和朋友視頻奸鸯,談到他上一周在外面跑市場(chǎng)調(diào)研咪笑,選擇相對(duì)合適的門店,辦理相關(guān)證件執(zhí)照娄涩,蓄...
    眼中繞世界閱讀 268評(píng)論 0 0
  • 考試結(jié)束后窗怒,這兩天,我一直在對(duì)家長(zhǎng)們進(jìn)行訪談。類似銷售部經(jīng)理進(jìn)行回訪扬虚。主要是和家長(zhǎng)交流有關(guān)此次期末考試的心得努隙,以及...
    王櫟涵閱讀 817評(píng)論 6 7
  • 如若思念有形狀 便在那青園街上 本欲小楷個(gè)時(shí)間 然后再勾勒方向 怎奈半晌,又過了半晌 仍是白紙一張 莫非畫筆太羞澀...
    人到低谷閱讀 194評(píng)論 0 0