每日一道演算法題--leetcode 112--路徑總和--python

杉杉不要bug發表於2019-03-26

【題目描述】

每日一道演算法題--leetcode 112--路徑總和--python
【程式碼思路】

在本題的基礎上深化,可見我的下一篇:leetcode 113--路徑總和II

做這道題首先想到的,就是遍歷這棵樹的所有根結點到葉結點的路徑,將每條路徑的和儲存在一個list中,最後看list中是否含有題目給定的資料即可。遍歷一棵樹的所有路徑,一定是要用到深度優先,寫遞迴函式的,那麼還是抓住一個點去看,就拿5這個結點來看,當遞迴函式輸入的結點是5。

那麼我首先是要去判斷這個結點是否有左右子樹的,用一個變數sum1存放一路總和。我的遞迴函式是plus(root,sum1);如果有左子樹,那麼呼叫plus(root,sum1+5);如果有右子樹,那麼呼叫plus(root,sum1+5);有左右子樹呼叫遞迴函式傳入的sum1數值應該是一致的,都是sum1+root.val。

        if root.left:
            self.plus(root.left,sum1+root.val)
        if root.right:
            self.plus(root.right,sum1+root.val)
複製程式碼

如果這個結點沒有左右子樹了,說明是葉結點了,那麼就直接加上該葉結點的數值,把這個sum1存在list中就好了。

if not root.left and not root.right:
    sum1+=root.val
    print "葉結點:",root.val,"sum1=",sum1
    self.sum_list.append(sum1)
複製程式碼

在主調函式中呼叫這個plus遞迴函式,我定義sum_list為類的一個屬性,所以在類內部可直接通過self.sum_list讀寫。

    self.sum_list=[]
複製程式碼

在主調函式中再判斷一下,sum是否包含在sum_list中即可

def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """ 
        sum1=0
        if not root:return False
        self.plus(root,sum1)
        return sum in self.sum_list
複製程式碼

【原始碼】

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


class Solution(object):
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        self.sum_list=[]
        sum1=0
        if not root:return False
        self.plus(root,sum1)
        return sum in self.sum_list
    def plus(self,root,sum1):
        print "執行plus(",root.val,sum1,")"
        if not root.left and not root.right:
            sum1+=root.val
            print "葉結點:",root.val,"sum1=",sum1
            self.sum_list.append(sum1)
        if root.left:
            self.plus(root.left,sum1+root.val)
        if root.right:
            self.plus(root.right,sum1+root.val)
        return False
複製程式碼

【遞迴過程重現】

為了更好理解,我以一棵樹為例,將遞迴過程列印出來。樹為:

每日一道演算法題--leetcode 112--路徑總和--python
執行原始碼,遞迴過程為:

執行plus( 5,0 )
執行plus( 4,5 )
執行plus( 11,9 )
執行plus( 7,20 )
葉結點: 7 sum1= 27
執行plus( 2,20 )
葉結點: 2 sum1= 22
執行plus( 8,5 )
執行plus( 13,13 )
葉結點: 13 sum1= 26
執行plus( 4,13 )
執行plus( 1,17 )
葉結點: 1 sum1= 18
複製程式碼

相關文章