From 11b04202d86ea71f25ab4e851b9ab6d3c1d08272 Mon Sep 17 00:00:00 2001 From: LouisFonda Date: Fri, 25 Apr 2025 22:59:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BA=8C=E5=8F=89?= =?UTF-8?q?=E6=A0=91=E5=B1=82=E6=AC=A1=E9=81=8D=E5=8E=86102,103,199,637?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../binary-tree/102二叉树的层序遍历.js | 74 +++++++++++++++++++ .../103二叉树的锯齿形层次bianli.js | 51 +++++++++++++ .../binary-tree/199二叉树的右视图.js | 53 +++++++++++++ .../binary-tree/637二叉树的层平均值.js | 48 ++++++++++++ 4 files changed, 226 insertions(+) create mode 100644 top-interview-leetcode150/binary-tree/102二叉树的层序遍历.js create mode 100644 top-interview-leetcode150/binary-tree/103二叉树的锯齿形层次bianli.js create mode 100644 top-interview-leetcode150/binary-tree/199二叉树的右视图.js create mode 100644 top-interview-leetcode150/binary-tree/637二叉树的层平均值.js diff --git a/top-interview-leetcode150/binary-tree/102二叉树的层序遍历.js b/top-interview-leetcode150/binary-tree/102二叉树的层序遍历.js new file mode 100644 index 0000000..c23604d --- /dev/null +++ b/top-interview-leetcode150/binary-tree/102二叉树的层序遍历.js @@ -0,0 +1,74 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @return {number[][]} + */ +const levelOrder = function (root) { + +}; + +/* +层序遍历,无需多言 +*/ +function f1(root) { + if (!root) return []; // 如果树为空,返回空数组 + + const result = []; // 用于存储每一层的节点值 + const queue = [root]; // 初始化队列,开始时只有根节点 + + while (queue.length > 0) { + const levelSize = queue.length; // 当前层的节点数 + const levelValues = []; // 存储当前层节点的值 + + // 遍历当前层的所有节点 + for (let i = 0; i < levelSize; i++) { + const node = queue.shift(); // 弹出队列中的第一个节点 + levelValues.push(node.val); // 将节点值加入当前层的结果 + + // 如果节点有左子节点,加入队列 + if (node.left) queue.push(node.left); + // 如果节点有右子节点,加入队列 + if (node.right) queue.push(node.right); + } + + // 将当前层的节点值加入最终结果 + result.push(levelValues); + } + + return result; +} + +/* +二叉树的层序遍历老生常谈了,通常使用一个队列来处理,但是js中的数组shift的操作复杂度为O(1),这里我们使用一个head指针来优化,表示 +shift要弹出的元素 +*/ + +function f2(root) { + const ans = []; // 返回的遍历结果 + + const queue = []; // 层序遍历使用的队列 + if (root) queue.push(root); + let head = 0; // 队列需要弹出的元素的下标 + while (head < queue.length) { + const n = queue.length - head; // 每一层的元素个数 + + // 遍历这一层元素,将值存入levelDatas中 + const levelDatas = []; + for (let i = 0; i < n; i++) { + const node = queue[head++]; + levelDatas.push(node.val); + // 将左右节点加入下一层 + if (node.left) queue.push(node.left); + if (node.right) queue.push(node.right); + } + } + + return ans; +} diff --git a/top-interview-leetcode150/binary-tree/103二叉树的锯齿形层次bianli.js b/top-interview-leetcode150/binary-tree/103二叉树的锯齿形层次bianli.js new file mode 100644 index 0000000..05a007f --- /dev/null +++ b/top-interview-leetcode150/binary-tree/103二叉树的锯齿形层次bianli.js @@ -0,0 +1,51 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @return {number[][]} + * https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/?envType=study-plan-v2&envId=top-interview-150 + */ +const zigzagLevelOrder = function (root) { + +}; + +/* +这个题目就是102的变种,只需记录一个遍历,order,如果order为true就从左到右,否则从右到左,这里直接复制102的代码 +*/ + +function f1(root) { + if (!root) return []; // 如果树为空,返回空数组 + + const result = []; // 用于存储每一层的节点值 + const queue = [root]; // 初始化队列,开始时只有根节点 + + let order = true; // 判断这一层数据是从左到右还是从右到左 + + while (queue.length > 0) { + const levelSize = queue.length; // 当前层的节点数 + const levelValues = []; // 存储当前层节点的值 + + // 遍历当前层的所有节点 + for (let i = 0; i < levelSize; i++) { + const node = queue.shift(); // 弹出队列中的第一个节点 + levelValues.push(node.val); // 将节点值加入当前层的结果 + + // 如果节点有左子节点,加入队列 + if (node.left) queue.push(node.left); + // 如果节点有右子节点,加入队列 + if (node.right) queue.push(node.right); + } + + // 将当前层的节点值加入最终结果 + result.push(order ? levelValues : levelSize.reverse()); + order = !order; + } + + return result; +} diff --git a/top-interview-leetcode150/binary-tree/199二叉树的右视图.js b/top-interview-leetcode150/binary-tree/199二叉树的右视图.js new file mode 100644 index 0000000..f623af5 --- /dev/null +++ b/top-interview-leetcode150/binary-tree/199二叉树的右视图.js @@ -0,0 +1,53 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @return {number[]} + * https://leetcode.cn/problems/binary-tree-right-side-view/?envType=study-plan-v2&envId=top-interview-150 + */ +const rightSideView = function (root) { + +}; + +/* +按照题目要求,很容易想到利用层序遍历,将每一层的最后一个结果保存进 ans这个数组,最后返回ans就是我们所需要的答案 +*/ + +function f1(root) { + const ans = []; // 储存结果的数组 + const queue = []; // 层序遍历需要使用的队列 + if (root) queue.push(root); + + while (queue.length > 0) { + // 获取每一层的最后一个元素存入 ans + const n = queue.length; + ans.push(queue[n - 1].val); + + // 将下一层元素压入队列 + for (let i = 0; i < n; i++) { + const node = queue.shift(); + if (node.left) { + queue.push(node.left); + } + if (node.right) { + queue.push(node.right); + } + } + } + + return ans; +} + +/* +思路2: 使用dfs优先遍右子树,将每一层遇到的第一个节点储存到一个map中,当遍历完所有元素,按照层数返回map中的值即可 +过程:右子树DFS,如果当前节点不为空,查看这一层是否已经有元素了,如果没有那么这个值就是这一层的第一个元素,将他 +加入映射, +*/ + +// TODO: diff --git a/top-interview-leetcode150/binary-tree/637二叉树的层平均值.js b/top-interview-leetcode150/binary-tree/637二叉树的层平均值.js new file mode 100644 index 0000000..7fcb1f2 --- /dev/null +++ b/top-interview-leetcode150/binary-tree/637二叉树的层平均值.js @@ -0,0 +1,48 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @return {number[]} + * https://leetcode.cn/problems/average-of-levels-in-binary-tree/?envType=study-plan-v2&envId=top-interview-150 + */ +const averageOfLevels = function (root) { + +}; + +/* +直接层序遍历,之后对每一层的数据求和,再求平均数(保留五位小数) +*/ +function f1(root) { + const queue = [root]; + const ans = []; + + while (queue.length > 0) { + const n = queue.length; + let sum = 0; // 每一层数据的和 + + // 遍历每一层的所有数据,对它们求和 + for (let i = 0; i < n; i++) { + const node = queue.shift(); + sum += node.val; + // 将左右子节点存入下一层 + if (node.left) queue.push(node.left); + if (node.right) queue.push(node.right); + } + + // 求平均数,保留五位小数,并存入结果集 + ans.push(Number((sum / n).toFixed(5))); + } + return ans; +} + +/* +使用DFS来遍历,利用一个数组levelData保存如下数据,数组元素的下标表示每一层的信息,元素为一个对象{sum: 这层元素的和, count: 这层元素个数} +dfs的时候如果当前层数level小于leveData.length,表示这是新层的第一个数据,就levelData.push({sum: curNode.val, count:1}) +*/ +// TODO: