diff --git a/102/solution1_1.java b/102/solution1_1.java new file mode 100644 index 0000000..cc69312 --- /dev/null +++ b/102/solution1_1.java @@ -0,0 +1,31 @@ +/** + * 自力解法。10分ほどでAC 時間計算量: O(n), 空間計算量: O(n) n:全要素数 思考プロセスとしては、各階層のものを順にみていくのでBFSが一番直感的だと思ったのでそれで実装。 + * 階層の区切りにQueueを使った。 + */ +public class solution1_1 { + public List> levelOrder(TreeNode root) { + List> values = new ArrayList<>(); + if (root == null) { + return values; + } + Queue nodes = new ArrayDeque<>(); + nodes.offer(root); + while (!nodes.isEmpty()) { + Queue nodesInNextLevel = new ArrayDeque<>(); + List valuesInNextLevel = new ArrayList<>(); + while (!nodes.isEmpty()) { + TreeNode current = nodes.poll(); + valuesInNextLevel.add(current.val); + if (current.left != null) { + nodesInNextLevel.offer(current.left); + } + if (current.right != null) { + nodesInNextLevel.offer(current.right); + } + } + values.add(valuesInNextLevel); + nodes = nodesInNextLevel; + } + return values; + } +} diff --git a/102/solution2_1.java b/102/solution2_1.java new file mode 100644 index 0000000..807a7fe --- /dev/null +++ b/102/solution2_1.java @@ -0,0 +1,28 @@ +/** + * LeetCodeの解法を参考にしたもの。 DFSでの解法。 BFSでなくともlevelで引数として渡せばOKという解法. stackつかってもできる。 + * 今回は、再帰の深さは最大で要素数nとなり、問題の制約は2000なのでまあ多分大丈夫かくらい + * + *

https://github.com/t0hsumi/leetcode/pull/26/files + * https://github.com/seal-azarashi/leetcode/pull/25/files でも大体同じ解法 + */ +public class solution2_1 { + public List> levelOrder(TreeNode root) { + List> values = + new ArrayList<>(); // https://github.com/t0hsumi/leetcode/pull/26/filesとかだとlevel_ordered_valuesにしてもう少し具体的にしてる。 + levelOrderHelper(root, 0, values); + return values; + } + + private void levelOrderHelper(TreeNode node, int level, List> values) { + if (node == null) { + return; + } + if (values.size() == level) { + values.add(new ArrayList<>()); + } + List list = values.get(level); + list.add(node.val); + levelOrderHelper(node.left, level + 1, values); + levelOrderHelper(node.right, level + 1, values); + } +} diff --git a/102/solution3_1.java b/102/solution3_1.java new file mode 100644 index 0000000..0a7fff2 --- /dev/null +++ b/102/solution3_1.java @@ -0,0 +1,20 @@ +/** いただいたコメントを元にした解法 再帰部分での条件式をより読み手に伝わり例外なくListがある状態になることが一目でわかるようにwhileを使用。(読み手への配慮) */ +public class solution3_1 { + public List> levelOrder(TreeNode root) { + List> values = new ArrayList<>(); + levelOrderHelper(root, 0, values); + return values; + } + + private void levelOrderHelper(TreeNode node, int level, List> values) { + if (node == null) { + return; + } + while (values.size() <= level) { + values.add(new ArrayList<>()); + } + values.get(level).add(node.val); + levelOrderHelper(node.left, level + 1, values); + levelOrderHelper(node.right, level + 1, values); + } +}