/* Common leetcode.com problem's scaffold code */ #ifndef RADII_LEETCODE #define RADII_LEETCODE #include #include #include #include #include #include /* Below TreeNode definition is copied from the problem at https://leetcode.com/problems/path-sum-iii/ */ struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} }; /* Above TreeNode definition is copied from the problem at https://leetcode.com/problems/path-sum-iii/ */ // struct node_and_explored { TreeNode *node; bool explored; }; std::ostream &operator<<(std::ostream &out, TreeNode *node) { out << "{"; if (!node) { out << "}"; return out; } std::queue bfs; bfs.push(node); while (bfs.size()) { node = bfs.front(); bfs.pop(); if (node) { out << node->val << ", "; bfs.push(node->left); bfs.push(node->right); } else out << "null, "; } out << "\b\b}"; return out; } template std::ostream &operator<<(std::ostream &out, const std::vector &vec) { out << "{"; if (!vec.size()) { out << "}"; return out; } for (T e : vec) { std::cout << e << ", "; } if (typeid(vec[0]) == typeid(std::string)) out << '\b'; out << " \b\b}"; return out; } template std::ostream &operator<<(std::ostream &out, const std::vector> &vec_2d) { out << "{"; if (!vec_2d.size()) { out << "}"; return out; } for (const std::vector &vec : vec_2d) out << vec << ", "; out << " \b\b}"; return out; } template TreeNode *vector_to_tree(std::vector &&vec) { if (!vec.size()) return nullptr; std::vector *nodes = new std::vector; for (std::size_t i = 0, upto = vec.size(); i < upto; i++) { // NOTE: cannot use T_MAX in problem input since treating it as empty node if (vec[i] == std::numeric_limits::max()) nodes->emplace_back(nullptr); else nodes->emplace_back(new TreeNode(vec[i])); } for (std::size_t i = 0, upto = vec.size(); i < upto; i++) { if (!(*nodes)[i]) continue; std::size_t left = 2 * i + 1, right = 2 * i + 2; if (left < upto) (*nodes)[i]->left = (*nodes)[left]; if (right < upto) (*nodes)[i]->right = (*nodes)[right]; } return (*nodes)[0]; } #endif