手撕演算法 二叉樹中和為某一值的路徑及變形

2021-10-06 13:55:26 字數 2372 閱讀 4719

二叉樹樹中和為某一值的路徑,該題目是劍指offer上的一道題目,第一次刷題的時候一次就過了,所以沒有當回事,當我遇到乙個該題目的變形題的時候卻一直通過不了,發現自己還是眼高手低,因此重新總結和記錄一下。

面試題34. 二叉樹中和為某一值的路徑

輸入一棵二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。

示例:給定如下二叉樹,以及目標和 sum = 22,

返回:

分析: 尋找二叉樹中和為某一值的路徑,那麼就是從根節點出發找到它的葉子節點,二叉樹遍歷中只有先序遍歷是從根節點出發,因此我們使用先序遍歷來解決這道題。實現思路可以直接看**。

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

list

list=

newarraylist

<

>()

;countpathsum

(root,sum,lists,list)

;return lists;

}public

void

countpathsum

(treenode root,

int sum,list

> lists,list

list)

//當前要執行的操作

sum-=root.val;

list.

add(root.val)

;//如果該節點為葉子節點並且sum為0,則加入路徑

if(sum==

0&&root.left==null&&root.right==null)

//更深層次的遍歷

countpathsum

(root.left,sum,lists,list)

;countpathsum

(root.right,sum,lists,list)

;//重置

sum-=root.val;

list.

remove

(list.

size()

-1);

}}

這道題目明顯是二叉樹中和為某一路徑的變形題,不同之處是這道題是n叉樹,最高分是乘積。使用遞迴解題方法與上面相似。這裡需要記錄一下的是自己一直通不過的原因:

自己原來的**是下面這樣的:

也就是把重置原來的狀態放到了for迴圈裡面了,傻乎乎的認為for迴圈裡面每次執行完遞迴都要重置狀態,導致只能走到最左邊的一條路徑,其實對比上面的二叉樹中和為某一值的路徑就可以得到答案,for迴圈中每次去遞迴都是用的當前狀態,因此需要在for迴圈外面重置狀態

for

(int i =

0; i < edges.length; i++

)}

package zhongxing;

public

class

test1

public

static

inthelper

(int numsnode,

int rootnode,

int[

] values,

int[

] edges,

boolean

visited,

int score)

} score /= values[rootnode-1]

; visited[rootnode]

=false

;return maxscore;

}public

static

void

main

(string[

] args)

;int

edges =,,

,};int res =

find(5

,1, values, edges)

; system.out.

println

(res);}

}

最後,回顧一下使用遞迴解決問題的套路:

第一步:判斷遞迴終止條件(如上面這道變形題,遞迴終止條件可能是在進一步遞迴的時候就確定了)

第二步:確定當前的操作

第三步:進行更深層次的遞迴

第四步:重置為原來的狀態

演算法 二叉樹中和為某一值的路徑

要求 輸入一顆二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。程式 struct treenode class solution return result private void findpathres tree...

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

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的左右子樹後從棧中移除。每訪問乙個節點,就計算當前路徑值 可直接利用父節點的路徑值 當其等於給定值且當前節點是葉子節點時,就列印...