題目描述
輸入一顆二叉樹的根節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的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...