From 1d629738e270b7b3395732aa65aa22e9f0174f63 Mon Sep 17 00:00:00 2001
From: colorbox <colorbox222@gmail.com>
Date: Wed, 19 Feb 2025 01:53:10 +0900
Subject: [PATCH] 102. Binary Tree Level Order Traversal

---
 102/step1.cpp   | 36 ++++++++++++++++++++++++++++++++++++
 102/step2_1.cpp | 37 +++++++++++++++++++++++++++++++++++++
 102/step2_2.cpp | 25 +++++++++++++++++++++++++
 102/step3.cpp   | 22 ++++++++++++++++++++++
 4 files changed, 120 insertions(+)
 create mode 100644 102/step1.cpp
 create mode 100644 102/step2_1.cpp
 create mode 100644 102/step2_2.cpp
 create mode 100644 102/step3.cpp

diff --git a/102/step1.cpp b/102/step1.cpp
new file mode 100644
index 0000000..9a3eef3
--- /dev/null
+++ b/102/step1.cpp
@@ -0,0 +1,36 @@
+/*
+Solve Time: 21:38
+
+Time : O(N^2)
+Space : O(N^2)
+*/
+class Solution {
+ public:
+  vector<vector<int>> levelOrder(TreeNode* root) {
+    if (!root) {
+      return {};
+    }
+    auto left = levelOrder(root->left);
+    auto right = levelOrder(root->right);
+    auto merged_level_vals = merge_two_trees(left, right);
+    vector<vector<int>> level_order = {{root->val}};
+    level_order.insert(level_order.end(), merged_level_vals.begin(), merged_level_vals.end());
+    return level_order;
+  }
+
+ private:
+  vector<vector<int>> merge_two_trees(vector<vector<int>>& left, vector<vector<int>>& right) {
+    vector<vector<int>> merged_levels;
+    for (int i = 0; i < max(left.size(), right.size()); ++i) {
+      vector<int> current_level_vals;
+      if (i < left.size()) {
+        current_level_vals.insert(current_level_vals.end(), left[i].begin(), left[i].end());
+      }
+      if (i < right.size()) {
+        current_level_vals.insert(current_level_vals.end(), right[i].begin(), right[i].end());
+      }
+      merged_levels.push_back(current_level_vals);
+    }
+    return merged_levels;
+  }
+};
diff --git a/102/step2_1.cpp b/102/step2_1.cpp
new file mode 100644
index 0000000..ead29ff
--- /dev/null
+++ b/102/step2_1.cpp
@@ -0,0 +1,37 @@
+/*
+Time : O(N)
+Space : O(N)
+
+再帰を用いずに書いてみる。
+currentはnextとの対比として自然なので使用した。
+XXX_level_nodesはちょっと変数名がくどすぎる気もしたが、今見ているlevelというのを強調できるのでcurrent_nodesなどよりも適切に感じる。
+
+*/
+class Solution {
+ public:
+  vector<vector<int>> levelOrder(TreeNode* root) {
+    vector<vector<int>> level_order;
+    queue<TreeNode*> current_level_nodes;
+    queue<TreeNode*> next_level_nodes;
+    current_level_nodes.push(root);
+    while (true) {
+      vector<int> same_level_vals;
+      while (!current_level_nodes.empty()) {
+        auto node = current_level_nodes.front();
+        current_level_nodes.pop();
+        if (!node) {
+          continue;
+        }
+        same_level_vals.push_back(node->val);
+        next_level_nodes.push(node->left);
+        next_level_nodes.push(node->right);
+      }
+      swap(current_level_nodes, next_level_nodes);
+      if (same_level_vals.empty()) {
+        break;
+      }
+      level_order.push_back(same_level_vals);
+    }
+    return level_order;
+  }
+};
diff --git a/102/step2_2.cpp b/102/step2_2.cpp
new file mode 100644
index 0000000..750eb96
--- /dev/null
+++ b/102/step2_2.cpp
@@ -0,0 +1,25 @@
+class Solution {
+ public:
+  vector<vector<int>> levelOrder(TreeNode* root) {
+    vector<vector<int>> level_ordered_nums;
+    vector<TreeNode*> current_level_nodes = {root};
+    while (!current_level_nodes.empty()) {
+      vector<TreeNode*> next_level_nodes;
+      vector<int> same_level_nums;
+      for (int i = 0; i < current_level_nodes.size(); ++i) {
+        if (!current_level_nodes[i]) {
+          continue;
+        }
+        same_level_nums.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_nums.empty()) {
+        break;
+      }
+      level_ordered_nums.push_back(same_level_nums);
+      swap(current_level_nodes, next_level_nodes);
+    }
+    return level_ordered_nums;
+ }
+};
diff --git a/102/step3.cpp b/102/step3.cpp
new file mode 100644
index 0000000..b443335
--- /dev/null
+++ b/102/step3.cpp
@@ -0,0 +1,22 @@
+class Solution {
+ public:
+  vector<vector<int>> levelOrder(TreeNode* root) {
+    if (!root) {
+      return {};
+    }
+    vector<vector<int>> level_order = {{root->val}};
+    auto left_level_order = levelOrder(root->left);
+    auto right_level_order = levelOrder(root->right);
+    for (int i = 0; i < max(left_level_order.size(), right_level_order.size()); ++i) {
+      vector<int> same_level_values;
+      if (i < left_level_order.size()) {
+        same_level_values.insert(same_level_values.end(), left_level_order[i].begin(), left_level_order[i].end());
+      }
+      if (i < right_level_order.size()) {
+        same_level_values.insert(same_level_values.end(), right_level_order[i].begin(), right_level_order[i].end());
+      }
+      level_order.push_back(same_level_values);
+    }
+    return level_order;
+  }
+};