在二叉樹中找出和爲某一值的全部路徑

題目:node

請寫一個程序建立一棵二叉樹,並按照必定規則,輸出二叉樹根節點到葉子節點的路徑。ios

規則以下:
一、從最頂端的根結點,到最下面的葉子節點,計算路徑經過的全部節點的和,若是與設置的某一值的相同,那麼輸出這條路徑上的全部節點。spa

二、從根節點遍歷樹時,請請按照左到右遍歷,即優先訪問左子樹的節點。code


二叉樹建立規則:從上到下一層一層的,按照從左到右的順序進行構造blog

輸入"10,5,12,4,7"值,構造的樹以下:內存

1)    10ci


2)    10
       /
      5
      
3)    10
       /\
      5  12
 
4)    10
       /\
      5  12 
     /
    4     
      
5)    10
       /\
      5  12 
     /\
    4  7字符串

針對上面的二叉樹,若是當前咱們設置的「路徑和」爲19,那麼輸出結果爲:get

10,5,4string

若是有多個路徑,按到左到右的順序遍歷生成的結果每行顯示一個顯示。例如若是當前咱們設置的「路徑和」爲22,那麼輸出結果爲:

10,5,7

10,12

若是沒有找到路徑和爲設置的值的路徑,輸出error。

 

運行時間限制: 無限制
內存限制: 無限制
輸入:

輸入整數N---路徑和

一行字符串,多個正整數,之間用","隔開

輸出:

知足條件的二叉樹路徑

樣例輸入:
22
10,5,12,4,7
樣例輸出:
10,5,7
10,12

 

代碼:

 1 #include <iostream>
 2 #include <sstream>
 3 #include <vector>
 4 #include <stdlib.h>
 5 
 6 using namespace std;
 7 
 8 struct TreeNode
 9 {
10     int val;
11     TreeNode *left, *right;
12     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
13 };
14 
15 void creatTree(TreeNode *&root, vector<int>& a, int i, int len)
16 {
17     if (i >= len)
18         return;
19     root = new TreeNode(a[i]);
20     creatTree(root->left, a, 2 * i + 1, len);
21     creatTree(root->right,a, 2 * i + 2, len);
22 }
23 
24 void inorderTraversal(TreeNode* root)
25 {
26     if (root)
27     {
28         cout << root->val << " ";
29         inorderTraversal(root->left);
30         inorderTraversal(root->right);
31     }
32 }
33 
34 vector<int> vec;
35 int sum = 0;
36 bool isCoutBlank = false;
37 bool isFind = false;
38 void pathTree(TreeNode*& root, int target)
39 {
40     sum += root->val;
41     vec.push_back(root->val);
42     if (sum == target && !root->left && !root->right)
43     {
44         isFind = true;
45         if(isCoutBlank)
46             cout << endl;
47         isCoutBlank = true;
48         for (int i = 0; i < vec.size() - 1; ++i)
49         {
50             cout << vec[i]<< ",";
51         }
52         cout << vec[vec.size() - 1];
53     }
54     if (root->left)
55         pathTree(root->left, target);
56     if (root->right)
57         pathTree(root->right, target);
58     sum -= root->val;
59     vec.pop_back();
60 }
61 
62 
63 int main()
64 {
65     TreeNode* root = nullptr;
66     int target;
67     cin >> target;
68     string val;
69     cin >> val;
70     string temp;
71     stringstream ss(val);
72     int node;
73     vector<int> nodes;
74     while (!ss.eof())
75     {
76         getline(ss, temp, ',');
77         stringstream stmp;
78         stmp << temp;
79         stmp >> node;
80         nodes.push_back(node);
81     }
82     creatTree(root, nodes, 0, nodes.size());
83     pathTree(root,target);
84     if (!isFind)
85         cout << "error";
86 }

 

另外一種方法:用多個臨時vector存儲路徑值,不用作pop_back操做

  1 #include <iostream>
  2 #include <sstream>
  3 #include <vector>
  4 #include <numeric>
  5 
  6 using namespace std;
  7 
  8 struct TreeNode
  9 {
 10     int val;
 11     TreeNode *left, *right;
 12     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 13 };
 14 
 15 void creatTree(TreeNode *&root, vector<int>& a, int i, int len)
 16 {
 17     if (i >= len)
 18         return;
 19     root = new TreeNode(a[i]);
 20     creatTree(root->left, a, 2 * i + 1, len);
 21     creatTree(root->right,a, 2 * i + 2, len);
 22 }
 23 
 24 void inorderTraversal(TreeNode* root)
 25 {
 26     if (root)
 27     {
 28         cout << root->val << " ";
 29         inorderTraversal(root->left);
 30         inorderTraversal(root->right);
 31     }
 32 }
 33 
 34 vector<int> vec;
 35 int sum = 0;
 36 bool isCoutBlank = false;
 37 bool isFind = false;
 38 void pathTree(TreeNode*& root, int target)
 39 {
 40     sum += root->val;
 41     vec.push_back(root->val);
 42     if (sum == target && !root->left && !root->right)
 43     {
 44         isFind = true;
 45         if(isCoutBlank)
 46             cout << endl;
 47         isCoutBlank = true;
 48         for (int i = 0; i < vec.size() - 1; ++i)
 49         {
 50             cout << vec[i]<< ",";
 51         }
 52         cout << vec[vec.size() - 1];
 53     }
 54     if (root->left)
 55         pathTree(root->left, target);
 56     if (root->right)
 57         pathTree(root->right, target);
 58     sum -= root->val;
 59     vec.pop_back();
 60 }
 61 
 62 void dfs(vector<int> v, TreeNode*& root, int level, int target)
 63 {
 64     if (!root)
 65         return;
 66     v[level++] = root->val;
 67     int sum = accumulate(v.begin(), v.end(),0);
 68     if (!root->left && !root->right && sum == target)
 69     {
 70         isFind = true;
 71         for (int i = 0; i < level; ++i)
 72         {
 73             if (i != 0)
 74                 cout << ",";
 75             cout << v[i];
 76         }
 77         cout << endl;
 78     }
 79     if (root->left)
 80         dfs(v, root->left, level, target);
 81     if (root->right)
 82         dfs(v, root->right, level, target);
 83 }
 84 
 85 int main()
 86 {
 87     TreeNode* root = nullptr;
 88     int target;
 89     cin >> target;
 90     string val;
 91     cin >> val;
 92     string temp;
 93     stringstream ss(val);
 94     int node;
 95     vector<int> nodes;
 96     while (!ss.eof())
 97     {
 98         getline(ss, temp, ',');
 99         stringstream stmp;
100         stmp << temp;
101         stmp >> node;
102         nodes.push_back(node);
103     }
104     creatTree(root, nodes, 0, nodes.size());
105 //     pathTree(root,target);
106 //     if (!isFind)
107 //         cout << "error";
108     vector<int> vec(nodes.size());
109     dfs(vec, root, 0, target);
110     if (!isFind)
111         cout << "error";
112 }
相關文章
相關標籤/搜索