輸入一顆二叉樹的根節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
分析:我們可以先從最簡單的情況開始考慮,最簡單的情況就是二叉樹只有乙個根節點,判斷根節點的值與期望值是否相同就ok了。二叉樹稍微複雜一點就是根節點還有左右子節點,這時候的過程就要多一步,仍舊是先判斷根節點的值與期望值,如果相等或者期望值更小,則不必繼續向下判斷,如果期望值更大,那麼可以向下繼續判斷,此時的期望值變成了「期望值-根節點的值」,用新的期望值分別與左右子節點的值進行比較,因為左右子節點已經是葉節點,符合路徑的定義,因此如果節點的值與新的期望值相等,就得到了答案,如果不相等,問題無解。現在推廣到普通的二叉樹,與上面的分析相同,就是乙個不斷更新期望值並與節點值比較的過程,這個過程是重複的,可以利用遞迴完成,下面來看一下具體**。
首先定義二叉樹
classtreenode:
def__init__
(self, x):
self.val =x
self.left =none
self.right = none
尋找路徑的**
classsolution:
#列印出二叉樹中結點值的和為輸入整數的所有路徑。
deffindpath(self, root, expectnumber):
ans=#
所有路徑的集合
if root==none:
return
ans
def iterpath(root,expectnumber,dir=):
if expectnumber>root.val:
#dir儲存當前路徑(不一定是符合要求的路徑)
#分別在左右子樹中尋找並更新期望值
if root.left!=none:
iterpath(root.left,expectnumber-root.val,dir)
if root.right!=none:
iterpath(root.right,expectnumber-root.val,dir)
elif expectnumber==root.val:
if root.right==none and root.left==none:#
如果節點的值與期望值相同,則判斷節點是否為葉子結點,如果是葉子結點則是符合條件的路徑
tmp=dir[:]
else
: dir.pop()
#!!!!!!!!!!!!!
iterpath(root,expectnumber)
return ans
二叉樹中和為某一值的路徑
include include using namespace std struct node void find path node r,int exceptedsum,vector path,int cursum node buildbtree int a,int i void preorder...
二叉樹中和為某一值的路徑
要輸出所有的路徑,必須額外用乙個棧來儲存當前路徑資訊。當訪問到節點a時,節點a的資訊要在訪問a的左右子樹時用到,因而,該資訊必須在遍歷a的左右子樹前加入到棧中,而在遍歷完a的左右子樹後從棧中移除。每訪問乙個節點,就計算當前路徑值 可直接利用父節點的路徑值 當其等於給定值且當前節點是葉子節點時,就列印...
二叉樹中和為某一值的路徑
面試題25 二叉樹中和為某一值的路徑 struct binarytreenode int value binarytreenode pleft binarytreenode pright 分析 用先序遍歷的方式遍歷二叉樹,初始時路徑為空。訪問乙個結點時若不到葉子結點且結點的和小於這個值那麼就把這個結...