diff --git a/README.md b/README.md
index afed3c5..59ff44b 100644
--- a/README.md
+++ b/README.md
@@ -353,6 +353,11 @@ LeetCode 与 LintCode 解题记录。此为个人练习仓库,代码中对重
- LeetCode 572. 另一个树的子树
- LintCode 1165. 另一个树的子树
+- [二叉树的层序遍历](src/tree/binary-tree-right-side-view.js)
+
+ - LeetCode 102. 二叉树的层序遍历
+ - LintCode 69. 二叉树的层次遍历
+
## 链表
- [合并K个排序链表](src/list/merge-k-sorted-lists.js)
diff --git a/src/tree/binary-tree-level-order-traversal.js b/src/tree/binary-tree-level-order-traversal.js
new file mode 100644
index 0000000..bc4d46b
--- /dev/null
+++ b/src/tree/binary-tree-level-order-traversal.js
@@ -0,0 +1,28 @@
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val) {
+ * this.val = val;
+ * this.left = this.right = null;
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number[][]}
+ */
+export const levelOrder = function (root) {
+ const res = []
+ const queue = [root]
+ while (queue.length) { // BFS
+ const tmp = []
+ const leave = queue.length // 记录这一层有几个
+ for (let i = 0; i < leave; i++) { // 一次性把固定个数的队列执行完
+ const node = queue.shift()
+ if (node.left) queue.push(node.left)
+ if (node.right) queue.push(node.right)
+ tmp.push(node.val)
+ }
+ res.push(tmp)
+ }
+
+ return res
+}
diff --git a/test/tree/binary-tree-level-order-traversal.test.js b/test/tree/binary-tree-level-order-traversal.test.js
new file mode 100644
index 0000000..208093f
--- /dev/null
+++ b/test/tree/binary-tree-level-order-traversal.test.js
@@ -0,0 +1,11 @@
+import { levelOrder } from '../../src/tree/binary-tree-level-order-traversal'
+import Tree from './Tree.js'
+
+test('二叉树的层序遍历', () => {
+ const source = [3, 9, 20, null, null, 15, 7]
+ expect(levelOrder(Tree.arrToTree(source))).toEqual([
+ [3],
+ [9, 20],
+ [15, 7]
+ ])
+})