feat: 添加二叉树层次遍历102,103,199,637
This commit is contained in:
parent
e7559ec1c7
commit
11b04202d8
74
top-interview-leetcode150/binary-tree/102二叉树的层序遍历.js
Normal file
74
top-interview-leetcode150/binary-tree/102二叉树的层序遍历.js
Normal file
@ -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;
|
||||||
|
}
|
51
top-interview-leetcode150/binary-tree/103二叉树的锯齿形层次bianli.js
Normal file
51
top-interview-leetcode150/binary-tree/103二叉树的锯齿形层次bianli.js
Normal file
@ -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;
|
||||||
|
}
|
53
top-interview-leetcode150/binary-tree/199二叉树的右视图.js
Normal file
53
top-interview-leetcode150/binary-tree/199二叉树的右视图.js
Normal file
@ -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:
|
48
top-interview-leetcode150/binary-tree/637二叉树的层平均值.js
Normal file
48
top-interview-leetcode150/binary-tree/637二叉树的层平均值.js
Normal file
@ -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:
|
Loading…
x
Reference in New Issue
Block a user