我正在研究二叉樹問題。目標是找到從根到葉的所有路徑,使得路徑上的值總和為給定的k。
為此,我以兩種不同的方式撰寫了相同的演算法:
- 第一個版本使用字串引數
a。 - 第二個版本使用串列引數
a。
它們應該給出相同的路徑結果,但第二個版本列印了一個包含樹中幾乎所有值的路徑。
版本 1
def rootToLeafPathsSumToK(root, k, a):
if root == None :
return None
if root.left==None and root.right==None:
if root.data==k:
print(a str(root.data) " ")
return
a =str(root.data) " "
rootToLeafPathsSumToK(root.left,k-root.data,a)
rootToLeafPathsSumToK(root.right,k-root.data,a)
輸出:
5 6 2
5 7 1
版本 2
def rootToLeafPathsSumToK(root, k, a):
if root == None :
return None
if root.left==None and root.right==None:
if root.data==k:
a.append(root.data)
print(a)
return
a.append(root.data)
rootToLeafPathsSumToK(root.left,k-root.data,a)
rootToLeafPathsSumToK(root.right,k-root.data,a)
uj5u.com熱心網友回復:
這兩個代碼片段之間的區別是:
在第一個版本中,
a字串在哪里,您執行a =str(root.data) " ". 這將創建一個新字串并將其分配給區域變數a。此操作不會影響呼叫者作為引數傳遞的字串。此外,字串在 Python 中是不可變的。在第二個版本中,
a串列在哪里,您執行a.append(root.data). 這不會創建新串列。它改變了呼叫者作為引數傳遞的串列。實際上,該代碼只有一個 list。因此,所有append呼叫都會影響該單個串列。
因此,在第一個版本中,添加值的效果是本地的并且不會影響呼叫者的字串,而在第二個版本中,效果也到達呼叫者,因為它們使用相同的串列。
要在第二個代碼版本中應用相同的本地原則,請將呼叫替換為append:
a = a [root.data]
現在原始串列a沒有變化。而是創建了一個新串列,并將其分配回區域變數a。但是在這里,呼叫者的串列仍然是原始串列。現在創建了一個新串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/490548.html
標籤:Python python-3.x 递归 数据结构 二叉树
