亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2021年07月15日 09:36:02   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(113.二叉樹路徑之和之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(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 的基礎(chǔ)上又需要找出路徑,但是基本思想都一樣,還是需要用深度優(yōu)先搜索 DFS,只不過數(shù)據(jù)結(jié)構(gòu)相對復(fù)雜一點,需要用到二維的 vector,而且每當(dāng) DFS 搜索到新結(jié)點時,都要保存該結(jié)點。而且每當(dāng)找出一條路徑之后,都將這個保存為一維 vector 的路徑保存到最終結(jié)果二維 vector 中。并且,每當(dāng) 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é)點都不存在且當(dāng)前累加值正好等于 sum 了,將這條路徑取出來存入結(jié)果 res 中,下面的部分是和一般的迭代中序?qū)懛ㄓ兴煌牡胤?,由于中序遍歷的特點,遍歷到當(dāng)前結(jié)點的時候,是有兩種情況的,有可能此時是從左子結(jié)點跳回來的,此時正要去右子結(jié)點,則當(dāng)前的結(jié)點值還是算在路徑中的;也有可能當(dāng)前是從右子結(jié)點跳回來的,并且此時要跳回上一個結(jié)點去,此時就要減去當(dāng)前結(jié)點值,因為其已經(jīng)不屬于路徑中的結(jié)點了。為了區(qū)分這兩種情況,這里使用一個額外指針 pre 來指向前一個結(jié)點,如果右子結(jié)點存在且不等于 pre,直接將指針移到右子結(jié)點,反之更新 pre 為 cur,cur 重置為空,val 減去當(dāng)前結(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;
    }
};

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

相關(guān)文章

  • C++實現(xiàn)LeetCode(167.兩數(shù)之和之二 - 輸入數(shù)組有序)

    C++實現(xiàn)LeetCode(167.兩數(shù)之和之二 - 輸入數(shù)組有序)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(167.兩數(shù)之和之二 - 輸入數(shù)組有序),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++中Boost.Chrono時間庫的使用方法

    C++中Boost.Chrono時間庫的使用方法

    chrono是一個time library, 源于boost,現(xiàn)在已經(jīng)是C++11標(biāo)準(zhǔn)了,下面這篇文章主要給大家介紹了關(guān)于C++中Boost.Chrono時間庫的使用方法,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • C++數(shù)據(jù)結(jié)構(gòu)二叉搜索樹的實現(xiàn)應(yīng)用與分析

    C++數(shù)據(jù)結(jié)構(gòu)二叉搜索樹的實現(xiàn)應(yīng)用與分析

    從這篇博客開始,我就要和大家介紹有關(guān)二叉搜索樹的知識,它還衍生出了兩棵樹——AVL樹和紅黑樹,在后面兩篇博客我都會介紹。今天先從二叉搜索樹開始引入
    2022-02-02
  • 總結(jié)c++性能優(yōu)化策略

    總結(jié)c++性能優(yōu)化策略

    在本篇文章中小編給大家總結(jié)了關(guān)于C++的性能優(yōu)化策略的相關(guān)知識點,對此有興趣的朋友可以參考學(xué)習(xí)下。
    2018-03-03
  • C++11中跳轉(zhuǎn)initializer_list實現(xiàn)分析

    C++11中跳轉(zhuǎn)initializer_list實現(xiàn)分析

    這篇文章主要介紹了C++11中跳轉(zhuǎn)initializer_list實現(xiàn)分析,實例分析initializer_list<T>初體驗,結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • 排序算法模板實現(xiàn)示例分享

    排序算法模板實現(xiàn)示例分享

    這篇文章主要介紹了排序算法模板實現(xiàn)示例,需要的朋友可以參考下
    2014-03-03
  • Java C++算法題解leetcode1592重新排列單詞間的空格

    Java C++算法題解leetcode1592重新排列單詞間的空格

    這篇文章主要為大家介紹了Java C++算法題解leetcode1592重新排列單詞間的空格示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • C++ Thread實現(xiàn)簡單的socket多線程通信

    C++ Thread實現(xiàn)簡單的socket多線程通信

    本文主要介紹了C++ Thread實現(xiàn)簡單的socket多線程通信,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C++ 中Vector常用基本操作

    C++ 中Vector常用基本操作

    標(biāo)準(zhǔn)庫vector類型是C++中使用較多的一種類模板,本文給大家分享C++ 中Vector常用基本操作,感興趣的朋友一起看看吧
    2017-10-10
  • c語言獲取直播吧最近一周nba比賽信息

    c語言獲取直播吧最近一周nba比賽信息

    這篇文章主要介紹了使用c語言獲取直播吧最近一周nba比賽信息的方法,需要的朋友可以參考下
    2014-04-04

最新評論