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

2021-08-21 03:46:11 字數 3349 閱讀 3767

題目:輸入一棵二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。ps:從根結點開始,一直到葉子結點形式一條路徑。

分析:要找出路徑之和為指定整數的路徑,就需要遍歷二叉樹的所有路徑。此外,由於路徑是指根結點到葉子結點的線段,因此我們想到採用深度優先的方式遍歷二叉樹。深度優先演算法又分為:先序遍歷、中序遍歷、後序遍歷,其中先序遍歷符合我們的要求。

首先需要建立乙個棧,用來儲存當前路徑的結點。採用先序遍歷演算法遍歷結點時,先將途中經過的結點均存入棧中,然後判斷當前結點是否為葉子結點,若不是葉子結點的話,則遞迴遍歷該結點的左孩子和右孩子;若是葉子結點的話,計算下當前棧中所有結點之和是否為指定的整數,若是的話列印棧中所有元素。然後這個函式在返回之前,將當前葉子結點從棧中刪除。**如下:

/**

* 題目:輸入一棵二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。

* ps:從根結點開始,一直到葉子結點形式一條路徑。

* @author 大閒人柴毛毛

* @date 2023年3月15日 */

public

class

printbinarypath {

/**

* 分析:要找出路徑之和為指定整數的路徑,就需要遍歷二叉樹的所有路徑。

* 此外,由於路徑是指根結點到葉子結點的線段,因此我們想到採用深度優先的方式遍歷二叉樹。

* 深度優先演算法又分為:先序遍歷、中序遍歷、後序遍歷,其中先序遍歷符合我們的要求。 */

/*** 首先需要建立乙個棧,用來儲存當前路徑的結點。

* 採用先序遍歷演算法遍歷結點時,先將途中經過的結點均存入棧中,然後判斷當前結點是否為葉子結點,若不是葉子結點的話,則遞迴遍歷該結點的左孩子和右孩子;

* 若是葉子結點的話,計算下當前棧中所有結點之和是否為指定的整數,若是的話列印棧中所有元素。

* 然後這個函式在返回之前,將當前葉子結點從棧中刪除。 */

/*** 列印二叉樹中路徑之和為n的路徑

* @param root 二叉樹

* @param n 路徑之和

* @return 返回函式能否正確執行 */

public

static

boolean

printbinarypath(binarytreenoderoot,int n){

//樹為空

if(root==null){

system.out.println("樹為空!");

return

false;

//n小於0

if(n<=0){

system.out.println("n小於等於0!");

return

false;

//建立棧

stackstack = new stack();

//開始遞迴查詢路徑

printbinarypath(root,n,stack);

return

true;

/**

* 遞迴尋找路徑之和為n的路徑

* @param root 二叉樹根結點

* @param n 指定整數

* @param stack 用於儲存當前路徑的棧 */

private

static

void

printbinarypath(binarytreenoderoot, int n, stackstack) {

//若當前根結點為葉子結點

if(root.left==null && root.right==null){

//將葉子結點入棧

stack.add(root.data);

//計算當前路徑之和

int sum = 0;

iteratorit = stack.iterator();

while(it.hasnext())

sum += it.next();

//若當前路徑之和==n,則列印這條路徑

if(sum==n){

iteratorit2 = stack.iterator();

while(it2.hasnext())

system.out.print(it2.next()+",");

system.out.println("\n-------------------");

//將當前葉子結點出棧

stack.pop();

//返回上層結點

return;

//若當前結點為非葉子結點

else{

//將根結點入棧

stack.add(root.data);

//若左孩子存在,遞迴左孩子

if(root.left!=null)

printbinarypath(root.left,n,stack);

//若右孩子存在,遞迴右孩子

if(root.right!=null)

printbinarypath(root.right,n,stack);

//將當前葉子結點出棧

stack.pop();

//返回上層結點

return;

/**

* 測試 */

public

static

void

main(string args){

//構建二叉樹

binarytreenodenode1 = new binarytreenode();

binarytreenodenode2 = new binarytreenode();

binarytreenodenode3 = new binarytreenode();

binarytreenodenode4 = new binarytreenode();

binarytreenodenode5 = new binarytreenode();

node1.data = 10;

node2.data = 5;

node3.data = 12;

node4.data = 4;

node5.data = 7;

node1.left = node2;

node1.right = node3;

node2.left = node4;

node2.right = node5;

printbinarypath(node1,19);

/**

* 二叉樹的結點 */

class

binarytreenode

{t data;//結點的資料域

binarytreenodeleft;//左子樹

binarytreenoderight;//右子樹

面試題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...