1. 程式人生 > 其它 >迴圈迭代求打印出和與輸入整數相等的所有路徑

迴圈迭代求打印出和與輸入整數相等的所有路徑

輸入一個整數和一棵二元樹。從樹的根結點開始往下訪問,一直到葉結點所經過的所有結點形成一條路徑。打印出和與輸入整數相等的所有路徑。
例如,輸入整數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;
}