樹中和為定值的路徑

題目

注意題目的意思是要從頭結(jié)點(diǎn)到葉子的路徑。

這個沒辦法只能遍歷每一條路徑然后判斷。
不過因?yàn)槭菢?,所以我們可以方便的使用遞歸和回溯。

因?yàn)槲覀円蛴〕鰜硭晕覀円4嬉粋€path 路徑,儲存當(dāng)前路徑的節(jié)點(diǎn)。

路徑和sum是同時更新的。

  • 加入當(dāng)前節(jié)點(diǎn):
    path.push_back(phead->data); cur_sum += phead->data;

  • 刪除當(dāng)前節(jié)點(diǎn)
    path.pop_back(); cur_sum -= phead->data;
    上面這句就是回溯的體現(xiàn)。

  • 遞歸實(shí)現(xiàn)遍歷

    if (phead->left)
        find_path(phead->left, sum,cur_sum, path);
    //path.pop_back();

    if (phead->right)
        find_path(phead->right, sum,cur_sum, path);
  • 在程序的最開始進(jìn)行判斷,打?。?/li>
    if (isLeaf(phead) && cur_sum == sum)
        print_vec(path);
  • 小函數(shù):
bool isLeaf(treeNode* node)
{
    return (node->left==NULL || node->right==NULL);
}
void print_vec(std::vector<int> path)
{
    auto beg = path.begin();
    for (beg; beg != path.end(); beg++)
        std::cout << *beg<<" ";
}

總的:

#include <vector>
struct treeNode
{
    int data;
    treeNode* left;
    treeNode* right;
};
bool isLeaf(treeNode* node)
{
    return (node->left==NULL || node->right==NULL);
}
void print_vec(std::vector<int> path)
{
    auto beg = path.begin();
    for (beg; beg != path.end(); beg++)
        std::cout << *beg<<" ";
}

void find_path(treeNode* tree, int sum,int cur_sum,std::vector<int> path)
{
    //int cur_sum=0;
    treeNode* phead=tree;
    if (!tree)
        return;
    path.push_back(phead->data);
    cur_sum += phead->data;

    if (isLeaf(phead) && cur_sum == sum)
        print_vec(path);

    if (phead->left)
        find_path(phead->left, sum,cur_sum, path);
    //path.pop_back();

    if (phead->right)
        find_path(phead->right, sum,cur_sum, path);

    path.pop_back();
    cur_sum -= phead->data;
}

文章參考何海濤大神文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容