題目:node
請寫一個程序建立一棵二叉樹,並按照必定規則,輸出二叉樹根節點到葉子節點的路徑。ios 規則以下: 二、從根節點遍歷樹時,請請按照左到右遍歷,即優先訪問左子樹的節點。code
輸入"10,5,12,4,7"值,構造的樹以下:內存 1) 10ci
針對上面的二叉樹,若是當前咱們設置的「路徑和」爲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 }