原題是:
思路是:
這個(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ò)誤涧黄。
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)該是:
多一點(diǎn)反思:
如果把669這個(gè)題,設(shè)置所有節(jié)點(diǎn)都在L-R范圍以外(為避免選入無限循環(huán))
在每一層直接返回下一層的結(jié)果攘乒,像這樣:
可以順利的把所有節(jié)點(diǎn)剪光贤牛。
是因?yàn)槊恳淮蜗聦拥姆祷刂担贿@一層接收后则酝,不經(jīng)任何處理殉簸,直接上交上一層。
只有這樣的時(shí)候沽讹,才可以這樣寫代碼般卑,直接返回遞歸函數(shù)的返回值