迴圈迭代求打印出和與輸入整數相等的所有路徑
阿新 • • 發佈:2021-01-11
輸入一個整數和一棵二元樹。從樹的根結點開始往下訪問,一直到葉結點所經過的所有結點形成一條路徑。打印出和與輸入整數相等的所有路徑。
例如,輸入整數9和如下二元樹:則打印出兩條路徑:3,6和3,2,4。
使用迴圈的方法來實現。
#include <iostream> #include <vector> #include <stack> using namespace std; struct tree { int val; tree* left; tree* right; tree(int x) : val(x), left(NULL), right(NULL) {} }; int main() { tree* root = new tree(3); root->left = new tree(2); root->right = new tree(6); root->left->left = new tree(5); root->left->right = new tree(4); int nnn = 9; vector<vector<int>> ans; ans.push_back(vector<int>()); stack<pair<tree*, int>> st; st.push(make_pair(root, 0)); stack<tree* > sst; int cnt = 0; while (!st.empty()) { if (cnt >= ans.size() && cnt > 0) { ans.push_back(vector<int>(ans[cnt - 1])); } int cur = st.top().second; tree* tmp = st.top().first; st.pop(); while (!sst.empty() && sst.top()->right != tmp) { sst.pop(); ans[cnt].pop_back(); } while (tmp) { cur += tmp->val; sst.push(tmp); ans[cnt].push_back(tmp->val); if (tmp->right != NULL) { st.push(make_pair(tmp->right, cur)); } else if (cur == nnn && tmp->left == NULL) { ++cnt; break; } tmp = tmp->left; } if (cur != nnn && st.empty()) { ans.pop_back(); } } for (auto vec : ans) { for (auto i : vec) { cout << i << " "; } cout<<endl; } return 0; }