LeetCode 129. Суммировать числа от корня до листа
8ms
Временная сложность: O(n)
Пространственная сложность: O(n)
Рекурсивный вызов функции
class Solution { public: int sumNumbers(TreeNode* root) { int res = 0; if (!root) return res; DFS(root, res, root->val); return res; } void DFS(TreeNode* root, int& res, int cur) { if (!root) return; if (!root->left && !root->right) { res += cur; } if (root->left) { DFS(root->left, res, cur*10 + root->left->val); } if (root->right) { DFS(root->right, res, cur*10 + root->right->val); } } };
Вначале я думал использовать string
для отслеживания каждого пути, но передавать строку как копию везде очень дорого и делает программу очень медленной, 12 ms
.
class Solution { public: int sumNumbers(TreeNode* root) { int res = 0; if (!root) return res; vector<string> sums; DFS(root, sums, to_string(root->val)); for (string str : sums) { res += stoi(str); } return res; } void DFS(TreeNode* root, vector<string>& sums, string path) { if (!root) return; if (!root->left && !root->right) { sums.push_back(path); } if (root->left) { DFS(root->left, sums, path + to_string(root->left->val)); } if (root->right) { DFS(root->right, sums, path + to_string(root->right->val)); } } };