// 面試題34:二叉樹中和為某一值的路徑
// 題目:輸入一棵二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所
// 有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
void findpath(binarytreenode* proot, int expectedsum, std::vector& path, int& currentsum);
void findpath(binarytreenode* proot, int expectedsum)
// 如果不是葉結點,則遍歷它的子結點
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)
{ if(testname != nullptr)
printf(「%s begins:\n」, testname);
findpath(proot, expectedsum);
printf("\n");
// 10
// / \
// 5 12
// /\
// 4 7
// 有兩條路徑上的結點和為22
void test1()
{ binarytreenode* pnode10 = createbinarytreenode(10);
binarytreenode* pnode5 = createbinarytreenode(5);
binarytreenode* pnode12 = createbinarytreenode(12);
binarytreenode* pnode4 = createbinarytreenode(4);
binarytreenode* pnode7 = createbinarytreenode(7);
connecttreenodes(pnode10, pnode5, pnode12);
connecttreenodes(pnode5, pnode4, pnode7);
printf("two paths should be found in test1.\n");
test("test1", pnode10, 22);
destroytree(pnode10);
// 10
// / \
// 5 12
// /\
// 4 7
// 沒有路徑上的結點和為15
求和為n的連續正整數序列
題目 輸入乙個正數n,輸出所有和為n連續正整數序列。例如輸入15,由於1 2 3 4 5 4 5 6 7 8 15,所以輸出3個連續序列1 5 4 6和7 8。解法1 因為整數序列是有序的,可以設立兩個游標begin和end,通過判區間 begin,end 的和是否為n來得到這個序列。如果區間和大於...
N個數求和
n個數求和 本題的要求很簡單,就是求n個數字的和。麻煩的是,這些數字是以有理數分子 分母的形式給出的,你輸出的和也必須是有理數的形式。輸入格式 輸入第一行給出乙個正整數n le 100 隨後一行按格式a1 b1 a2 b2 給出n個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數的符號一定...
N個數求和
本題的要求很簡單,就是求n個數字的和。麻煩的是,這些數字是以有理數分子 分母的形式給出的,你輸出的和也必須是有理數的形式。輸入第一行給出乙個正整數n 100 隨後一行按格式a1 b1 a2 b2 給出n個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數的符號一定出現在分子前面。輸出上述數字...