求二叉樹所有路徑

題目描述:給一棵二叉樹,找出從根節點到葉子節點的所有路徑。
樣例:

遞歸 + 深搜的思路。還記得之前學過的用遞歸的方法解決二叉樹的前序遍歷的問題嗎?點擊打開鏈接,用的就是深搜的策略,遞歸實現。我們在這裏,依然用這種邏輯

基本解法可以這樣描述:從根節點出發找葉子,找到葉子之後,所有這條“找尋之路”上的所有節點構成了我們要打印出來的一條路徑。所以,我們需要建立一個全局變量path,存儲未到達當前節點時掃描過的路徑中有哪些節點,作爲從當前節點起,往葉子遍歷所經過的路徑的前綴。同理,最後的結果列表也是一個全局變量了。
所以,當LintCode中給出的函數形參只有一個root時,我們就需要再設定一個輔助函數,包含剛纔說的path和result,讓他們兩個成爲全局變量。
總結一下思路:
1. 建立一個字符串變量path和結果列表result,初始化爲空
2. 從根節點開始訪問,之後訪問其左子樹,再訪問其右子樹
3. 每訪問一個節點,將節點的值加入path,例如,訪問完根節點後,path = “1 ->”,並將這裏的path作爲新的變量加入左右子樹的遍歷函數
4. 遞歸“觸底”的條件:訪問的節點爲空

講的不是很清楚,對照代碼看一下吧
[python] view plain copy
“””
Definition of TreeNode:
class TreeNode:
def init(self, val):
self.val = val
self.left, self.right = None, None
“””
class Solution:
# @param {TreeNode} root the root of the binary tree
# @return {List[str]} all root-to-leaf paths
def binaryTreePaths(self, root):
# 建立兩個全局變量
path = “”
result = []
# 另建一個helper函數,方便對全局變量path,result的使用
self.helper(root, path, result)
return result

# void型函數,給結果列表result中添加由path爲前綴的所有路徑  
def helper(self, root, path, result):  

    if root is None:  
        return  
    path = path + str(root.val)  

    # 遞歸對左孩子求路徑  
    if root.left:  
        self.helper(root.left, path + "->", result)  
    # 遞歸對右孩子求路徑  
    if root.right:  
        self.helper(root.right, path + "->", result)  
    # 如果是葉子,加入result  
    if root.left is None and root.right is None:  
        result.append(path)  
    # Write your code here  

需要注意的是第33行,噹噹前訪問的節點爲葉子的時候,纔將path加入結果列表。
這裏是典型的遞歸,helper函數求的就是以參量root爲根節點,path爲路徑前綴(也就是到達這個節點之前經過的路徑)的子樹的所有路徑,我們只需要考慮遞歸“觸底”的條件(root爲空)和遞歸“升級”的條件(先用path加,再加左子樹所有路徑,再加右子樹所有路徑,如果左右子樹都爲空,也就是葉子了,就直接加入結果列表)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章