C++實(shí)現(xiàn)LeetCode(113.二叉樹(shù)路徑之和之二)
[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)文章希望大家以后多多支持腳本之家!
- C++實(shí)現(xiàn)LeetCode(41.首個(gè)缺失的正數(shù))
- C++實(shí)現(xiàn)LeetCode(40.組合之和之二)
- C++實(shí)現(xiàn)LeetCode(144.二叉樹(shù)的先序遍歷)
- C++實(shí)現(xiàn)LeetCode(94.二叉樹(shù)的中序遍歷)
- C++實(shí)現(xiàn)LeetCode(47.全排列之二)
- C++實(shí)現(xiàn)LeetCode(90.子集合之二)
- C++實(shí)現(xiàn)LeetCode(39.組合之和)
- C++實(shí)現(xiàn)LeetCode(52.N皇后問(wèn)題之二)
相關(guān)文章
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++使用郵件槽實(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)境下代碼提示智能化
作為程序猿的你,是否已經(jīng)喜歡或習(xí)慣依賴(lài)IDE開(kāi)發(fā)環(huán)境呢,有了IDE環(huán)境,即使你想不起方法全名,只要知道某個(gè)前綴,或哪怕在提示列表中,一一查詢,也可以找到自己想找的方法或?qū)傩?/div> 2013-01-01
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ù)逆序的情況解析
今天通過(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)易掃雷小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10最新評(píng)論

