劍指offerQ24二叉樹中和為某一值的路徑

2021-10-02 23:37:19 字數 3702 閱讀 3783

題目描述

輸入一顆二叉樹的根節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前)

ok,深度優先搜尋 dfs

並且路徑的定義為從根節點開始直到葉節點結束 難度不大

在做這一題之前,我們先來看看怎麼輸出二叉樹的從根結點到每個葉子節點的路徑。 如: 1234567

1

/ \

2 3

/ \ /

4 5 6

則返回 [[1, 2, 4], [1, 2, 5], [1, 3, 6]],其實就是深度優先遍歷。

# 遞迴解法

class

treenode

: def__init__(self, value)

: self.val= value

self.left=

none

self.right=

none

class

solution

:def

binarytreepaths

(self, root)

:if root ==

none

:return

result =

self.dfs(root,result,

[root.val]

)return result

defdfs(self, root, result, path)

:if root.left ==

none

and root.right ==

none

:if root.left !=

none

: self.dfs(root.left,result, path +

[root.left.val]

)if root.right!=

none

: self.dfs(root.right,result, path +

[root.right.val]

)

class

treenode

:def

__init__

(self, value)

: self.val= value

self.left=

none

self.right=

none

class

solution2

:def

binarytreepaths2

(self, root)

:if root ==

none

:return

result=

stack=

(root,

[root.val]))

while stack:

node,path = stack.pop(

)if node.left ==

none

and node.right ==

none

:if node.left !=

none

:(node.left,path +

[node.left.val]))

if node.right!=

none

:(node.right,path +

[node.right.val]))

return result

現在再來看這一題,就會發現:其實這一題就是引出所有的從根結點到葉子結點的路徑的變形,就在判斷條件上多了乙個 sum(path) == self.sums。所以,解法如下:

class

treenode

: def__init__(self, value)

: self.val= value

self.left=

none

self.right=

none

class

solution

:def

binarytreepaths

(self, root)

:if root ==

none

:return

result =

self.sums = expectnumber

self.dfs(root,result,

[root.val]

)return result

defdfs(self, root, result, path)

:if root.left ==

none

and root.right ==

none

andsum

(path)

== self.sums:

if root.left !=

none

: self.dfs(root.left,result, path +

[root.left.val]

)if root.right!=

none

: self.dfs(root.right,result, path +

[root.right.val]

)

class

treenode

:def

__init__

(self, value)

: self.val= value

self.left=

none

self.right=

none

class

solution2

:def

binarytreepaths2

(self, root)

:if root ==

none

:return

result=

stack=

(root,

[root.val]))

while stack:

node,path = stack.pop(

)if node.left ==

none

and node.right ==

none

andsum

(path)

== expectnumber:

if node.left !=

none

:(node.left,path +

[node.left.val]))

if node.right!=

none

:(node.right,path +

[node.right.val]))

return result

執行後發現不符合題目中返回值的list中,陣列長度大的陣列靠前

加上res.sort(key=lambda i:len(i),reverse = true)

大神簡易版(風痕):

劍指offer Q07 重建二叉樹

這是第二遍刷題了 本題主要就是怎樣從乙個先序序列和乙個中序序列怎樣推導出一棵樹。首先,從先序可以得到root結點就是第乙個節點,然後到中序中去找其對應的位置inpos,然後該位置的左邊就是root的左子樹中序序列,右邊就是root的右子樹中序序列,且同時可以根inpos的位置計算出root的左子樹序...

劍指offer系列(24)二叉樹中和為某一值的路徑

題目描述 輸入一顆二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。思路分析 先序遍歷,訪問節點時,把該節點新增到路徑上去,並累加該節點的值 如果該節點為葉節點,並且路徑中節點值的和剛好等於輸入的整數,則符合當前路徑要...

劍指Offer 二叉樹 二叉樹中和為某一值的路徑

輸入一棵二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。示例 給定如下二叉樹,以及目標和 sum 22 返回 解題思路 演算法流程 實現 definition for a binary tree node.class tree...