在二元樹中找出和為某一值的所有路徑

2021-06-03 14:09:06 字數 1658 閱讀 7386

1. 題目

在二元樹中找出和為某一值的所有路徑

題目:輸入乙個整數和一棵二元樹。

從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。

列印出和與輸入整數相等的所有路徑。

例如 輸入整數22和如下二元樹

10  

/ \  

5 12  

/ \  

4 7則列印出兩條路徑:10, 12和10, 5, 7。

二元樹節點的資料結構定義為:

struct binarytreenode // a node in the binary tree

;2. 分析

當訪問到某一結點時,把該結點新增到路徑上,並累加當前結點的值。如果當前結點為葉結點並且當前路徑的和剛好等於輸入的整數,則當前的路徑符合要求,我們把它列印出來。如果當前結點不是葉結點,則繼續訪問它的子結點。當前結點訪問結束後,遞迴函式將自動回到父結點。因此我們在函式退出之前要在路徑上刪除當前結點並減去當前結點的值,以確保返回父結點時路徑剛好是根結點到父結點的路徑。我們不難看出儲存路徑的資料結構實際上是乙個棧結構,因為路徑要與遞迴呼叫狀態一致,而遞迴呼叫本質就是乙個壓棧和出棧的過程。

3. 參考**

//.h

// 定義乙個簡單的棧結構

#define max_stack_size 100

class cstack

;// 棧共有多少個元素

int count();

// 獲取某指定元素

int getelement(int index);

};struct binarytreenode // a node in the binary tree

;class ctreepathsum

;//.cpp

#include "stdafx.h"

#include "treepathsum.h"

#include

using namespace std;

cstack::cstack(void)

cstack::~cstack(void)

// 加入乙個新的元素

// 成功時返回true

bool cstack::push(int data)

bool cstack::pop(int &popdata)

// 此棧是否為空

// 為空時返回true

bool cstack::isempty()

int cstack::getelement(int index)

ctreepathsum::ctreepathsum(void)

ctreepathsum::~ctreepathsum(void)

void ctreepathsum::addbstreenode(binarytreenode * & pcurrent, int value)

else

else if ((pcurrent->m_nvalue) < value)

else

}bool ctreepathsum::isleaf(binarytreenode *pcurrent)

void ctreepathsum::findpath(binarytreenode *pcurrent, int sum)

void ctreepathsum::test()

在二元樹中找出和為某一值的所有路徑

4.在二元樹中找出和為某一值的所有路徑 題目 輸入乙個整數和一棵二元樹。從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。列印出和與輸入整數相等的所有路徑。例如 輸入整數22和如下二元樹 10 5 12 4 7則列印出兩條路徑 10,12和10,5,7。c codes as belo...

在二元樹中找出和為某一值的所有路徑

題目 輸入乙個整數和一棵二元樹。從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。列印出和與輸入整數相等的所有路徑。例如 輸入整數22和如下二元樹 10 5 12 4 7 則列印出兩條路徑 10,12和10,5,7。此方法用了雙向鍊錶來儲存路徑,當然也可以用容器vector來構造佇列...

在二元樹中找出和為某一值的所有路徑

在二元樹中找出和為某一值的所有路徑 題目 輸入乙個整數和一棵二元樹。從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。列印出和與輸入整數相等的所有路徑。例如 輸入整數22和如下二元樹 10 5 12 4 7則列印出兩條路徑 10,12和10,5,7。二元樹節點的資料結構定義為 str...