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

2021-08-10 17:35:12 字數 1357 閱讀 4135

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

用深度遍歷方式尋找該路徑。

需要用三個成員變數記錄中間結果:

vectorpaths;//即最終返回結果

vector path;//當前遍歷的路徑

int sum = 0;//當前路徑的和

注意的是,深度遍歷完成後,要把list中的最後乙個數刪除。深度遍歷,遍歷到葉子節點後(即得到乙個答案後),要返回到該葉子節點的父節點,所以要把該list中的最後乙個數刪除。如二叉樹(1,2,1,#,#,1,#),輸入的引數是3,遍歷到2時,得到乙個list=,然後要返回節點1,即pop_back 2 ,然後繼續遍歷得到另乙個答案list=。

**如下:

class

solution

void

dfs(treenode* root,

int target)

path.

push_back

(root-

>val)

; sum +

= root-

>val;

if(sum == target && root-

>left ==

nullptr

&& root-

>right ==

nullptr

)dfs

(root-

>left, target)

;dfs

(root-

>right, target)

;// 一條路徑找到後,當前path的最後乙個元素要pop,深度遍歷繼續尋找其他路徑

sum -

= path.

back()

; path.

pop_back()

;}};

首先看下一道比較簡單的題目,輸入乙個二叉樹,輸出所有路徑代表的十進位制數之和。

一般二叉樹類的題目,肯定要用到遞迴函式。

本題中

int sumnumbers(treenode* root) 

void sumnumbershelper(treenode* root, int &total_sum, int sum)

sum = sum*10 + root->val;

if(root->left == null && root->right == null)

if(root->left != null)

if(root->right != null)

}

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

輸入一棵二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。從根的根結點開始往下一直到葉節點 所經過的結點形成一條路徑。include include using namespace std 二叉樹結點定義 struct binarytreenode 建立二叉樹結點 binarytree...

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

以先序的方式構建二叉樹,輸入 表示結點為空 void createbinarytree binarytreenode proot else void printinorder binarytreenode proot int tmain intargc,tchar argv 說明 用vector模擬...

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

輸入一顆二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。演算法思路 先序遍歷二叉樹,並用乙個vector模擬乙個棧,記錄路徑,將訪問過的結點的值放入,遍歷的時候先計算當前路徑上結點值的總和,並將結點的值放入vecto...