這同樣是一道遞迴和二叉樹的題目,就是給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。返回乙個布林型別,題目描述如下:
這道題目看似沒有頭緒,拿到題目很多朋友就會想是不是要深度優先遍歷一遍二叉樹,然後分別求和,找出結果。其實,我們可以運用一下逆向思維,入上圖中的例子,sum = 22,那麼我們除去根節點 5 ,在 5 的左右子樹中找到和為 22-5=17 的子樹,然後我們再在跟節點為 4 和 8 的子樹中找是否滿足和為17,然後分別除去 4 和 8,分別在 4 和 8 的子樹中找和為 17-4=13 和17-8=9的子樹,以此類推到葉子節點,這裡我們就可以運用遞迴的思想去做了,**如下所示:
# 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
"""# root 節點為none
if not root:
return false
# root 節點沒有左右子樹的情況
if not root.left and not root.right:
return root.val == sum
# 左子樹進行遞迴操作
if self.haspathsum(root.left, sum - root.val):
return true
# 右子樹進行遞迴操作
if self.haspathsum(root.right, sum - root.val):
return true
我們用遞迴的方法就可以很容易解決這個題目了,希望通過這道題目,我們可以應用逆向思維和遞迴的方法來解決類似的題目,以及加深大家對遞迴演算法的理解,謝謝。 LeetCode112 路徑總和
給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和sum 22,5 48 1113 4 721返回true,因為存在目標和為 22 的根節點到葉子節點的路徑5 4 11 2。遍...
LeetCode 112 路徑總和
給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和 sum 22,5 4 8 11 13 4 7 2 1 返回 true,因為存在目標和為 22 的根節點到葉子節點的路徑 5 ...
Leetcode 112 路徑總和
給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。說明 葉子節點是指沒有子節點的節點。示例 給定如下二叉樹,以及目標和sum 22,5 48 1113 4 721 返回true,因為存在目標和為 22 的根節點到葉子節點的路徑5 4 11 2。...