一、題目
輸入一棵二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
二、關鍵
1.儲存路徑使用棧的後進先出的特點,但是是使用vector實現的(比較好用)。
2.三、解釋
1、解題思路:當用前序遍歷的方式訪問到某乙個節點時,我們把該節點新增到路徑上,並累加該節點的值。如果訪問的節點時葉節點,並且路徑中節點值的和剛好等於輸入的整數,則當前路徑符合要求,我們把該路徑列印出來。如果當前節點不是葉節點,則繼續訪問它的子節點。當前節點訪問結束後,遞迴函式將自動的回到它的父節點。因此,我們在函式退出之前要在路徑上刪除當前節點並減去當前節點的值,確保返回父節點時路徑剛好是從根節點到父節點。
四、**
#include #include "..\utilities\binarytree.h"
#include void findpath(binarytreenode* proot, int expectedsum, std::vector& path, int& currentsum);
void findpath(binarytreenode* proot, int expectedsum)
void findpath
( binarytreenode* proot,
int expectedsum,
std::vector& path,
int& currentsum
) // 如果不是葉結點,則遍歷它的子結點
if(proot->m_pleft != nullptr)
findpath(proot->m_pleft, expectedsum, path, currentsum);
if(proot->m_pright != nullptr)
findpath(proot->m_pright, expectedsum, path, currentsum);
// 在返回到父結點之前,在路徑上刪除當前結點,
// 並在currentsum中減去當前結點的值
currentsum -= proot->m_nvalue;
path.pop_back();
} // ********************測試**********************
void test(char* testname, binarytreenode* proot, int expectedsum)
// 10
// / \
// 5 12
// /\
// 4 7
// 有兩條路徑上的結點和為22
void test1()
// 10
// / \
// 5 12
// /\
// 4 7
// 沒有路徑上的結點和為15
void test2()
// 5
// /
// 4
// /
// 3
// /
// 2
// /
// 1
// 有一條路徑上面的結點和為15
void test3()
// 1
// \
// 2
// \
// 3
// \
// 4
// \
// 5
// 沒有路徑上面的結點和為16
void test4()
// 樹中只有1個結點
void test5()
// 樹中沒有結點
void test6()
int main(int argc, char* argv)
面試題34 二叉樹中和為某一值的路徑
輸入一棵二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。示例 給定如下二叉樹,以及目標和 sum 22,5 4 8 11 13 4 7 2 5 1返回 5,4,11,2 5,8,4,5 難點在於如何儲存路徑 法一 可以利用遞迴...
面試題34 二叉樹中和為某一值的路徑
輸入一顆二叉樹的根節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。考察點 具體例子抽象函式 二叉樹遍歷 思路 如下,遞迴的思想。findpath函式不太好理解。struct treenode void findpath...
面試題34 二叉樹中和為某一值的路徑
題目 輸入一棵二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。include include include include include include using namespace std struct binaryt...