劍指offer24--二叉樹中和為某一值的路徑
阿新 • • 發佈:2021-02-11
題目描述
輸入一顆二叉樹的根節點和一個整數,按字典序打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
思路
首先想到的就是減去當前根節點的值,再分別往左右遞迴。
但是實際操作起來就要知道如何中止遞迴?如何將滿足條件的路徑趕緊輸出並回溯到上個根結點往另一個方向遞迴。
如何在遞迴中保留之前的資訊?——使用全域性變數。
遞迴如何終止?——3種情況:
1.和滿足並且已經到了葉子結點——輸出並且回溯一個點
2.和不滿足並且沒有到葉子結點——繼續遞迴
3.和不滿足也到了葉子結點——回溯一個點
實現
class Solution {
public:
vector<vector<int> > vv;//全域性變數
vector<int> v;
void dfs(TreeNode* root,int sum)
{
v.push_back(root->val);//把當前點加入路徑
if (root->val==sum&&!root->left&&!root->right)
{
vv.push_back (v);
}
if (root->left) dfs(root->left,sum-root->val);
if (root->right) dfs(root->right,sum-root->val);
v.pop_back();//回溯(包括滿足並且到了葉子結點和沒滿足也到了葉子結點)
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if (!root) return {};
dfs(root,expectNumber);
sort(vv.begin(), vv.end());//按字典序排序輸出
return vv;
}
};
知識點
遞迴
二叉樹
關於牛客官方題解的看法
在本題中建立了全域性變數,但是官方題解中使用全域性變數也進行引數傳遞
個人看來是多此一舉,即使這裡是用引用(要是按值傳遞就問題更大了)