diff --git a/102.binary-tree-level-order-traversal.md b/102.binary-tree-level-order-traversal.md new file mode 100644 index 0000000000000000000000000000000000000000..ef2f743ab61aaa9a04f406f3bf6d959ec724e8ba --- /dev/null +++ b/102.binary-tree-level-order-traversal.md @@ -0,0 +1,125 @@ + +## 题目地址 +https://leetcode.com/problems/binary-tree-level-order-traversal/description/ + +## 题目描述 +``` +Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). + +For example: +Given binary tree [3,9,20,null,null,15,7], + 3 + / \ + 9 20 + / \ + 15 7 +return its level order traversal as: +[ + [3], + [9,20], + [15,7] +] +``` + +## 思路 + +这道题可以借助`队列`实现,首先把root入队,然后入队一个特殊元素Null(来表示每层的结束)。 + + +然后就是while(queue.length), 每次处理一个节点,都将其子节点(在这里是left和right)放到队列中。 + +然后不断的出队, 如果出队的是null,则表式这一层已经结束了,我们就继续push一个null。 + + +## 关键点解析 + +- 队列 + +- 队列中用Null(一个特殊元素)来划分每层 + +- 树的基本操作- 遍历 - 层次遍历(BFS) + + +## 代码 + +```js +/* + * @lc app=leetcode id=102 lang=javascript + * + * [102] Binary Tree Level Order Traversal + * + * https://leetcode.com/problems/binary-tree-level-order-traversal/description/ + * + * algorithms + * Medium (47.18%) + * Total Accepted: 346.4K + * Total Submissions: 731.3K + * Testcase Example: '[3,9,20,null,null,15,7]' + * + * Given a binary tree, return the level order traversal of its nodes' values. + * (ie, from left to right, level by level). + * + * + * For example: + * Given binary tree [3,9,20,null,null,15,7], + * + * + * ⁠ 3 + * ⁠ / \ + * ⁠ 9 20 + * ⁠ / \ + * ⁠ 15 7 + * + * + * + * return its level order traversal as: + * + * [ + * ⁠ [3], + * ⁠ [9,20], + * ⁠ [15,7] + * ] + * + * + */ +/** + * Definition for a binary tree node. + * function TreeNode(val) { + * this.val = val; + * this.left = this.right = null; + * } + */ +/** + * @param {TreeNode} root + * @return {number[][]} + */ +var levelOrder = function(root) { + if (!root) return []; + const items = []; // 存放所有节点 + const queue = [root, null]; // null 简化操作 + let levelNodes = []; // 存放每一层的节点 + + while (queue.length > 0) { + const t = queue.shift(); + + if (t) { + levelNodes.push(t.val) + if (t.left) { + queue.push(t.left); + } + if (t.right) { + queue.push(t.right); + } + } else { // 一层已经遍历完了 + items.push(levelNodes); + levelNodes = []; + if (queue.length > 0) { + queue.push(null) + } + } + } + + return items; +}; + +``` diff --git a/103.binary-tree-zigzag-level-order-traversal.md b/103.binary-tree-zigzag-level-order-traversal.md new file mode 100644 index 0000000000000000000000000000000000000000..beeefa71d9abd55a59ccfeb4a97eec592d046047 --- /dev/null +++ b/103.binary-tree-zigzag-level-order-traversal.md @@ -0,0 +1,135 @@ + +## 题目地址 +https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/description/ + +## 题目描述 +和leetcode 102 基本是一样的,思路是完全一样的。 + +``` +Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between). + +For example: +Given binary tree [3,9,20,null,null,15,7], + 3 + / \ + 9 20 + / \ + 15 7 +return its zigzag level order traversal as: +[ + [3], + [20,9], + [15,7] +] +``` + +## 思路 + +这道题可以借助`队列`实现,首先把root入队,然后入队一个特殊元素Null(来表示每层的结束)。 + + +然后就是while(queue.length), 每次处理一个节点,都将其子节点(在这里是left和right)放到队列中。 + +然后不断的出队, 如果出队的是null,则表式这一层已经结束了,我们就继续push一个null。 + + +## 关键点解析 + +- 队列 + +- 队列中用Null(一个特殊元素)来划分每层 + +- 树的基本操作- 遍历 - 层次遍历(BFS) + + +## 代码 + +```js +/* + * @lc app=leetcode id=103 lang=javascript + * + * [103] Binary Tree Zigzag Level Order Traversal + * + * https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/description/ + * + * algorithms + * Medium (40.57%) + * Total Accepted: 201.2K + * Total Submissions: 493.7K + * Testcase Example: '[3,9,20,null,null,15,7]' + * + * Given a binary tree, return the zigzag level order traversal of its nodes' + * values. (ie, from left to right, then right to left for the next level and + * alternate between). + * + * + * For example: + * Given binary tree [3,9,20,null,null,15,7], + * + * ⁠ 3 + * ⁠ / \ + * ⁠ 9 20 + * ⁠ / \ + * ⁠ 15 7 + * + * + * + * return its zigzag level order traversal as: + * + * [ + * ⁠ [3], + * ⁠ [20,9], + * ⁠ [15,7] + * ] + * + * + */ +/** + * Definition for a binary tree node. + * function TreeNode(val) { + * this.val = val; + * this.left = this.right = null; + * } + */ +/** + * @param {TreeNode} root + * @return {number[][]} + */ +var zigzagLevelOrder = function(root) { + if (!root) return []; + const items = []; + let isOdd = true; + let levelNodes = []; + + const queue = [root, null]; + + + while(queue.length > 0) { + const t = queue.shift(); + + if (t) { + levelNodes.push(t.val) + if (t.left) { + queue.push(t.left) + } + if (t.right) { + queue.push(t.right) + } + } else { + if (!isOdd) { + levelNodes = levelNodes.reverse(); + } + items.push(levelNodes) + levelNodes = []; + isOdd = !isOdd; + if (queue.length > 0) { + queue.push(null); + } + } + } + + return items + +}; +``` + diff --git a/README.md b/README.md index fc0c5fc545043d86f4c6edadc62c0c157d396530..b78a99372b8afc90ae382bb1f08360bcd9dd96de 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,7 @@ leetcode题解,记录自己的leecode解题之路。 - [75.sort-colors.md](https://github.com/azl397985856/leetcode/blob/master/75.sort-colors.md) - [86.partition-list](./86.partition-list.md) - [92.reverse-linked-list-ii](./92.reverse-linked-list-ii.md) +- [94.binary-tree-inorder-traversal](./94.binary-tree-inorder-traversal.md) +- [102.binary-tree-level-order-traversal](./102.binary-tree-level-order-traversal.md) +- [103.binary-tree-zigzag-level-order-traversal](./103.binary-tree-zigzag-level-order-traversal.md) ### 高级难度 \ No newline at end of file