diff --git a/8_binary_tree_level_order_traversal.cpp b/8_binary_tree_level_order_traversal.cpp new file mode 100644 index 0000000..3ccb1b3 --- /dev/null +++ b/8_binary_tree_level_order_traversal.cpp @@ -0,0 +1,119 @@ +/* Problem: https://leetcode.com/problems/binary-tree-level-order-traversal/ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Below TreeNode definition is copied from the problem +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 + +std::ostream &operator<<(std::ostream &out, TreeNode *node) { + std::queue bfs; + if (node) + bfs.push(node); + out << "{"; + 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 << "}"; + return out; +} + +std::ostream &operator<<(std::ostream &out, const std::vector &vec) { + out << "{"; + for (int num : vec) { + std::cout << num << ", "; + } + out << " }"; + return out; +} + +std::ostream &operator<<(std::ostream &out, + const std::vector> &vec_2d) { + out << "{"; + for (const std::vector &vec : vec_2d) + out << vec << ", "; + out << " }"; + return out; +} + +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++) { + if (vec[i] == INT_MIN) + nodes->emplace_back(nullptr); + else + nodes->emplace_back(new TreeNode(vec[i])); + } + + /* If input vector is a malformed tree with missing intermediate nodes than + * below loop will cause segfault*/ + for (std::size_t i = 0, upto = vec.size(); i < upto; i++) { + 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]; +} + +std::vector> solution(TreeNode *node) { + std::vector> tree_by_level; + std::queue current_q; + if (node != nullptr) { + current_q.push(node); + } + while (current_q.size()) { + std::queue next_q; + std::vector current_level; + while (current_q.size()) { + TreeNode *current_node = current_q.front(); + current_q.pop(); + current_level.push_back(current_node->val); + if (current_node->left) + next_q.push(current_node->left); + if (current_node->right) + next_q.push(current_node->right); + } + tree_by_level.push_back(current_level); + current_q = next_q; + } + return tree_by_level; +} + +int main() { + std::cout << vector_to_tree({3, 9, 20, INT_MIN, INT_MIN, 15, 17}) << '\n'; + std::cout << solution(vector_to_tree({3, 9, 20, INT_MIN, INT_MIN, 15, 17})) + << '\n' + << solution(vector_to_tree({1})) << '\n' + << solution(vector_to_tree({})) << '\n'; + return 0; +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d9b40a..3c1b3a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,3 +18,5 @@ add_executable(5_conflicting_appointments 5_conflicting_appointments.cpp) add_executable(6_find_all_missing_numbers 6_find_all_missing_numbers.cpp) add_executable(7_reverse_nodes_in_k_group 7_reverse_nodes_in_k_group.cpp) + +add_executable(8_binary_tree_level_order_traversal 8_binary_tree_level_order_traversal.cpp)