python怎么獲得二叉樹根到所有葉子的路徑?
問題描述
’’’這是二叉樹的定義’’’class TreeNode: def __init__(self, val):self.val = valself.left, self.right = None, None’’’這是路徑函數(shù)’’’def dfs(node, result, tmp): if node == None:return tmp.append(node) if node.left == None and node.right == None:result.append([i.val for i in tmp])return dfs(node.left, result, tmp) dfs(node.right, result, tmp)
這是我的代碼,但是每次都是打印全部節(jié)點。然后DEBUG發(fā)現(xiàn),每次遞歸到右子樹,tmp數(shù)組會保留之前遍歷完左子樹的狀態(tài),而根本不是我想的從根到右子樹的狀態(tài)。這是作用域的問題?可我找不到怎么解決,在此請求解答,謝謝
問題解答
回答1:是作用域的問題,你的算法大概沒有多少問題,主要是你要知道,給函數(shù)傳參的時候,尤其是傳入可變參數(shù)(你這里是列表)的時候,你要做到心中有數(shù)。這里你的問題主要集中在tmp上面,之所以會保留左子樹的狀態(tài),是因為你在遍歷左子樹的時候,添加了左子樹到tmp中了,然后你又在下一次遞歸調(diào)用中把添加后的列表放到了列表中,如果只有左子樹,是沒問題的,如果有右子樹,就會出現(xiàn)問題。語言表達能力有限,我把改過的代碼貼出來給你看看
import copyclass TreeNode: def __init__(self, val):self.val = valself.left, self.right = None, Nonedef dfs(node, result, tmp=list()): if node is None:return tmp.append(node) # 這里需要用拷貝而不是用 = 賦值,也可以遍歷賦值 tmp1 = copy.deepcopy(tmp) if node.left is None and node.right is None:result.append([i.val for i in tmp])return if node.left is not None:dfs(node.left, result, tmp) # 遍歷右子樹需要帶上不同的變量,否則左子樹的tmp和右子樹的tmp都指向一塊內(nèi)存 if node.right is not None:dfs(node.right, result, tmp1)if __name__ == ’__main__’: node1 = TreeNode(’a’) node2 = TreeNode(’b’) node3 = TreeNode(’c’) node4 = TreeNode(’d’) node5 = TreeNode(’e’) node6 = TreeNode(’f’) node7 = TreeNode(’g’) node1.left = node2 node1.right = node3 node2.left = node4 node2.right = node5 node4.left = node6 node3.left = node7 r = [] dfs(node1, result=r) print(r)
相關(guān)文章:
1. javascript - sublime快鍵鍵問題2. pdo - mysql 簡單注入疑問3. python - 使用from XXX import (XXX, XXX, XXX,) 導(dǎo)入模塊時, 括號()的意義何在?4. python判斷字符串相等?5. 谷歌訪問助手安裝不了6. Python中使用超長的List導(dǎo)致內(nèi)存占用過大7. html5 - 在一個頁面中 初始了兩個swiper 不知道哪里錯了 一直不對8. css - PC端不同分辨率下字體大小呈現(xiàn)9. javascript - JS中如何實現(xiàn) DIV內(nèi)部和鼠標(biāo)的距離10. c++ - 如何在python的阻塞的函數(shù)中獲取變量值
