【題目描述】
【程式碼思路】做這道題首先想到的,就是遍歷這棵樹的所有根結點到葉結點的路徑,將每條路徑的和儲存在一個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讀寫。
def __init__(self):
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 __init__(self):
self.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
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
複製程式碼
【遞迴過程重現】
為了更好理解,我以一棵樹為例,將遞迴過程列印出來。樹為:
執行原始碼,遞迴過程為:執行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
複製程式碼