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

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

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

[LeetCode] 113. Path Sum II 二叉樹路徑之和之二

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]
]

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

解法一:

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();
    }
};

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

解法二:

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;
    }
};

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

相關文章

  • C語言實現(xiàn)abs和fabs絕對值

    C語言實現(xiàn)abs和fabs絕對值

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

    C++11?constexpr使用詳解

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

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

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

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

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

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

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

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

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

    Qt數(shù)據(jù)庫相關應用開發(fā)總結(jié)

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

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

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

    C語言實現(xiàn)簡易掃雷小游戲

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

    C++基礎知識實例解析(一)

    這篇文章主要對C++基礎知識實例解析,通過四個簡短的案例,鞏固大家的基礎知識,需要的朋友可以參考下
    2015-08-08

最新評論

西畴县| 临江市| 东方市| 潜江市| 隆子县| 全州县| 太湖县| 淮阳县| 鄂伦春自治旗| 郴州市| 东宁县| 阜阳市| 咸丰县| 云安县| 镇安县| 阿拉善右旗| 海宁市| 清远市| 永修县| 吉水县| 肥城市| 福建省| 云霄县| 平顺县| 龙岩市| 大厂| 富平县| 民丰县| 兴宁市| 无锡市| 土默特右旗| 海丰县| 彩票| 元朗区| 黄山市| 城口县| 鄂伦春自治旗| 黔西县| 博野县| 永兴县| 叙永县|