最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(113.二叉樹(shù)路徑之和之二)

 更新時(shí)間:2021年07月15日 09:36:02   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(113.二叉樹(shù)路徑之和之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 113. Path Sum II 二叉樹(shù)路徑之和之二

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.

For example:
Given the below binary tree and sum = 22,

 5
/ \
4   8
/      / \
11  13  4
/  \         / \
7    2     5   1

return

[
[5,4,11,2],
[5,8,4,5]
]

這道二叉樹(shù)路徑之和在之前那道題 Path Sum 的基礎(chǔ)上又需要找出路徑,但是基本思想都一樣,還是需要用深度優(yōu)先搜索 DFS,只不過(guò)數(shù)據(jù)結(jié)構(gòu)相對(duì)復(fù)雜一點(diǎn),需要用到二維的 vector,而且每當(dāng) DFS 搜索到新結(jié)點(diǎn)時(shí),都要保存該結(jié)點(diǎn)。而且每當(dāng)找出一條路徑之后,都將這個(gè)保存為一維 vector 的路徑保存到最終結(jié)果二維 vector 中。并且,每當(dāng) DFS 搜索到子結(jié)點(diǎn),發(fā)現(xiàn)不是路徑和時(shí),返回上一個(gè)結(jié)點(diǎn)時(shí),需要把該結(jié)點(diǎn)從一維 vector 中移除,參見(jiàn)代碼如下:

解法一:

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<vector<int>> res;
        vector<int> out;
        helper(root, sum, out, res);
        return res;
    }
    void helper(TreeNode* node, int sum, vector<int>& out, vector<vector<int>>& res) {
        if (!node) return;
        out.push_back(node->val);
        if (sum == node->val && !node->left && !node->right) {
            res.push_back(out);
        }
        helper(node->left, sum - node->val, out, res);
        helper(node->right, sum - node->val, out, res);
        out.pop_back();
    }
};

下面這種方法是迭代的寫(xiě)法,用的是中序遍歷的順序,參考之前那道 Binary Tree Inorder Traversal,中序遍歷本來(lái)是要用棧來(lái)輔助運(yùn)算的,由于要取出路徑上的結(jié)點(diǎn)值,所以用一個(gè) vector 來(lái)代替 stack,首先利用 while 循環(huán)找到最左子結(jié)點(diǎn),在找的過(guò)程中,把路徑中的結(jié)點(diǎn)值都加起來(lái),這時(shí)候取出 vector 中的尾元素,如果其左右子結(jié)點(diǎn)都不存在且當(dāng)前累加值正好等于 sum 了,將這條路徑取出來(lái)存入結(jié)果 res 中,下面的部分是和一般的迭代中序?qū)懛ㄓ兴煌牡胤?,由于中序遍歷的特點(diǎn),遍歷到當(dāng)前結(jié)點(diǎn)的時(shí)候,是有兩種情況的,有可能此時(shí)是從左子結(jié)點(diǎn)跳回來(lái)的,此時(shí)正要去右子結(jié)點(diǎn),則當(dāng)前的結(jié)點(diǎn)值還是算在路徑中的;也有可能當(dāng)前是從右子結(jié)點(diǎn)跳回來(lái)的,并且此時(shí)要跳回上一個(gè)結(jié)點(diǎn)去,此時(shí)就要減去當(dāng)前結(jié)點(diǎn)值,因?yàn)槠湟呀?jīng)不屬于路徑中的結(jié)點(diǎn)了。為了區(qū)分這兩種情況,這里使用一個(gè)額外指針 pre 來(lái)指向前一個(gè)結(jié)點(diǎn),如果右子結(jié)點(diǎn)存在且不等于 pre,直接將指針移到右子結(jié)點(diǎn),反之更新 pre 為 cur,cur 重置為空,val 減去當(dāng)前結(jié)點(diǎn),st 刪掉最后一個(gè)結(jié)點(diǎn),參見(jiàn)代碼如下:

解法二:

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<vector<int>> res;
        vector<TreeNode*> st;
        TreeNode *cur = root, *pre = nullptr;
        int val = 0;
        while (cur || !st.empty()) {
            while (cur) {
                st.push_back(cur);
                val += cur->val;
                cur = cur->left;
            }
            cur = st.back(); 
            if (!cur->left && !cur->right && val == sum) {
                vector<int> v;
                for (auto &a : st) v.push_back(a->val);
                res.push_back(v);
            }
            if (cur->right && cur->right != pre) {
                cur = cur->right;
            } else {
                pre = cur;
                val -= cur->val;
                st.pop_back();
                cur = nullptr;
            }
        }
        return res;
    }
};

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(113.二叉樹(shù)路徑之和之二)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)二叉樹(shù)路徑之和之二內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)abs和fabs絕對(duì)值

    C語(yǔ)言實(shí)現(xiàn)abs和fabs絕對(duì)值

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)abs和fabs絕對(duì)值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++11?constexpr使用詳解

    C++11?constexpr使用詳解

    constexpr是一種比const?更嚴(yán)格的束縛,?它修飾的表達(dá)式本身在編譯期間可知,?并且編譯器會(huì)盡可能的?evaluate?at?compile?time,本文重點(diǎn)給大家介紹C++11?constexpr使用,需要的朋友可以參考下
    2021-12-12
  • C++使用郵件槽實(shí)現(xiàn)ShellCode跨進(jìn)程傳輸

    C++使用郵件槽實(shí)現(xiàn)ShellCode跨進(jìn)程傳輸

    在計(jì)算機(jī)安全領(lǐng)域,進(jìn)程間通信(IPC)一直是一個(gè)備受關(guān)注的話題,在本文中,我們將探討如何使用Windows郵件槽(Mailslot)實(shí)現(xiàn)ShellCode的跨進(jìn)程傳輸,需要的可以參考下
    2023-12-12
  • VC6.0代碼自動(dòng)提示 VC6.0在win7環(huán)境下代碼提示智能化

    VC6.0代碼自動(dòng)提示 VC6.0在win7環(huán)境下代碼提示智能化

    作為程序猿的你,是否已經(jīng)喜歡或習(xí)慣依賴IDE開(kāi)發(fā)環(huán)境呢,有了IDE環(huán)境,即使你想不起方法全名,只要知道某個(gè)前綴,或哪怕在提示列表中,一一查詢,也可以找到自己想找的方法或?qū)傩?/div> 2013-01-01
  • 深入C++ 函數(shù)映射的使用詳解

    深入C++ 函數(shù)映射的使用詳解

    我比較喜歡用代碼結(jié)合實(shí)際來(lái)講解,下面我將以一段事例代碼來(lái)講解如何使用這幾種映射
    2013-07-07
  • C++深入淺出講解希爾排序算法的實(shí)現(xiàn)

    C++深入淺出講解希爾排序算法的實(shí)現(xiàn)

    希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡(jiǎn)單插入排序經(jīng)過(guò)改進(jìn)之后的一個(gè)更高效的版本,也稱(chēng)為縮小增量排序,同時(shí)該算法是沖破O(n2)的第一批算法之一。本文會(huì)以圖解的方式詳細(xì)介紹希爾排序的基本思想及其代碼實(shí)現(xiàn)
    2022-05-05
  • Qt數(shù)據(jù)庫(kù)相關(guān)應(yīng)用開(kāi)發(fā)總結(jié)

    Qt數(shù)據(jù)庫(kù)相關(guān)應(yīng)用開(kāi)發(fā)總結(jié)

    這篇文章主要為大家介紹了在Qt數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)中的一些經(jīng)驗(yàn)總結(jié),以及一些組件的使用介紹。文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-02-02
  • C語(yǔ)言實(shí)現(xiàn)整數(shù)逆序的情況解析

    C語(yǔ)言實(shí)現(xiàn)整數(shù)逆序的情況解析

    今天通過(guò)本文給大家介紹C語(yǔ)言實(shí)現(xiàn)整數(shù)逆序的情況,本文通過(guò)實(shí)例代碼多種舉例給大家介紹的非常詳細(xì),對(duì)C語(yǔ)言整數(shù)逆序相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷小游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++基礎(chǔ)知識(shí)實(shí)例解析(一)

    C++基礎(chǔ)知識(shí)實(shí)例解析(一)

    這篇文章主要對(duì)C++基礎(chǔ)知識(shí)實(shí)例解析,通過(guò)四個(gè)簡(jiǎn)短的案例,鞏固大家的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08

最新評(píng)論

南宁市| 汉沽区| 新兴县| 明水县| 鞍山市| 侯马市| 绥德县| 新源县| 大方县| 寿宁县| 阜城县| 德钦县| 临朐县| 大同市| 小金县| 新密市| 称多县| 龙井市| 新平| 大关县| 饶河县| 安西县| 仙游县| 西贡区| 福安市| 微山县| 德庆县| 通城县| 百色市| 阳东县| 怀集县| 罗定市| 万载县| 洛宁县| 安溪县| 抚远县| 隆德县| 阿图什市| 中江县| 遂平县| 青浦区|