diff --git a/103/step1.cpp b/103/step1.cpp new file mode 100644 index 0000000..9655ea9 --- /dev/null +++ b/103/step1.cpp @@ -0,0 +1,37 @@ +/* + +Solve Time : 11:48 + +Time : O(N) +Space : O(N) +*/ +class Solution { + public: + vector> zigzagLevelOrder(TreeNode* root) { + bool reversed_level = false; + vector> zigzag_level_ordered_vals; + vector current_level_nodes = {root}; + while (!current_level_nodes.empty()) { + vector next_level_nodes; + vector same_level_vals; + for (int i = 0; i < current_level_nodes.size(); ++i) { + if (!current_level_nodes[i]) { + continue; + } + same_level_vals.push_back(current_level_nodes[i]->val); + next_level_nodes.push_back(current_level_nodes[i]->left); + next_level_nodes.push_back(current_level_nodes[i]->right); + } + if (same_level_vals.empty()) { + break; + } + if (reversed_level) { + reverse(same_level_vals.begin(), same_level_vals.end()); + } + reversed_level = !reversed_level; + swap(current_level_nodes, next_level_nodes); + zigzag_level_ordered_vals.push_back(same_level_vals); + } + return zigzag_level_ordered_vals; + } +}; diff --git a/103/step2.cpp b/103/step2.cpp new file mode 100644 index 0000000..e18b0c2 --- /dev/null +++ b/103/step2.cpp @@ -0,0 +1,40 @@ +/* +Time: O(N) +Space: O(N) + +nil判定を最初に置くことでwhileの条件やbreakを素直にした +*/ +class Solution { + public: + vector> zigzagLevelOrder(TreeNode* root) { + if (!root) { + return {}; + } + bool reversed_level = false; + vector> zigzag_level_ordered_vals; + vector current_level_nodes = {root}; + while (!current_level_nodes.empty()) { + vector next_level_nodes; + vector same_level_vals; + for (int i = 0; i < current_level_nodes.size(); ++i) { + if (!current_level_nodes[i]) { + continue; + } + same_level_vals.push_back(current_level_nodes[i]->val); + if (current_level_nodes[i]->left) { + next_level_nodes.push_back(current_level_nodes[i]->left); + } + if (current_level_nodes[i]->right) { + next_level_nodes.push_back(current_level_nodes[i]->right); + } + } + if (reversed_level) { + reverse(same_level_vals.begin(), same_level_vals.end()); + } + reversed_level = !reversed_level; + swap(current_level_nodes, next_level_nodes); + zigzag_level_ordered_vals.push_back(same_level_vals); + } + return zigzag_level_ordered_vals; + } + }; diff --git a/103/step3.cpp b/103/step3.cpp new file mode 100644 index 0000000..7dc881f --- /dev/null +++ b/103/step3.cpp @@ -0,0 +1,32 @@ +class Solution { + public: + vector> zigzagLevelOrder(TreeNode* root) { + if (!root) { + return {}; + } + bool reverse_level = false; + vector> level_ordered_vals; + vector current_level_nodes = {root}; + while (!current_level_nodes.empty()) { + vector next_level_nodes; + level_ordered_vals.push_back({}); + for (int i = 0; i < current_level_nodes.size(); ++i) { + auto node = current_level_nodes[i]; + if (node->left) { + next_level_nodes.push_back(node->left); + } + if (node->right) { + next_level_nodes.push_back(node->right); + } + level_ordered_vals.back().push_back(node->val); + } + if (reverse_level) { + reverse(level_ordered_vals.back().begin(), level_ordered_vals.back().end()); + } + reverse_level = !reverse_level; + swap(next_level_nodes, current_level_nodes); + } + return level_ordered_vals; + } + }; + \ No newline at end of file