目录
续Day36
二叉树第二弹-层序遍历专项
1.二叉树的层序遍历
相当于图论中的广度优先搜索。
var levelOrder = function(root) {
const queue = [];
const ans = [];
if(root) queue.push(root);
while(queue.length) {
// size存放每层的节点个数
let size = queue.length;
// 把每层节点放进
let temp = [];
while(size--){
let node = queue.shift();
temp.push(node.val);
if(node.left) queue.push(node.left);
if(node.right) queue.push(node.right);
}
ans.push(temp);
}
return ans;
};
2.二叉树的层序遍历 II
107. 二叉树的层序遍历 II-中等
自底向上的层序遍历
var levelOrderBottom = function(root) {
const queue = [];
const ans = [];
if(root) queue.push(root);
while(queue.length) {
// size存放每层的节点个数
let size = queue.length;
// 把每层节点放进
let temp = [];
while(size--){
let node = queue.shift();
temp.push(node.val);
if(node.left) queue.push(node.left);
if(node.right) queue.push(node.right);
}
// ans.push(temp);
// 从数组前头插入值,避免最后反转数组,减少运算时间
ans.unshift(temp);
}
return ans;
};
3.二叉树的右视图
var rightSideView = function(root) {
const queue = [];
const ans = [];
if(root) queue.push(root);
while(queue.length) {
// 记录当前层 节点个数
let size = queue.length;
while(size){
let node = queue.shift();
if(size === 1){
ans.push(node.val);
}
node.left && queue.push(node.left);
node.right && queue.push(node.right);
size--;
}
}
return ans;
};
4.二叉树的层平均值
var averageOfLevels = function(root) {
//层级平均值
let res=[],queue=[];
queue.push(root);
while(queue.length&&root!==null){
//每一层节点个数
let length=queue.length;
//sum记录每一层的和
let sum=0;
for(let i=0;i<length;i++){
let node=queue.shift();
sum+=node.val;
node.left&&queue.push(node.left);
node.right&&queue.push(node.right);
}
//每一层的平均值存入数组res
res.push(sum/length);
}
return res;
};
5.N 叉树的层序遍历
429. N 叉树的层序遍历-中等
利用node.children
var levelOrder = function(root) {
const queue = [], ans = [];
if(root) queue.push(root);
while(queue.length) {
let size = queue.length;
let temp = [];
while(size--) {
let node = queue.shift();
for(let i of node.children) {
queue.push(i);
}
temp.push(node.val);
}
ans.push(temp);
}
return ans;
};
6.在每个树行中找最大值
var largestValues = function(root) {
const queue = [], ans = [];
if(root) queue.push(root);
while(queue.length){
let size = queue.length;
// 可以把temp设置为队列中第一个元素 let temp = queue[0].val;
let temp = - Number.MAX_VALUE;
while(size--){
let node = queue.shift();
node.left && queue.push(node.left);
node.right && queue.push(node.right);
temp = Math.max(node.val,temp);
}
ans.push(temp)
}
return ans;
};
7.填充每个节点的下一个右侧节点指针
因为初始状态下,所有 next 指针都被设置为 NULL。所以我们不用对最右侧节点做操作,即不用赋NULL,因此就需要对size做判断。
var connect = function(root) {
const queue = [];
if(root) queue.push(root);
while(queue.length) {
let size = queue.length;
while(size--) {
let node = queue.shift();
// 需要对size做个判断
if(size > 0){
node.next = queue[0];
}
node.left && queue.push(node.left);
node.right && queue.push(node.right);
}
}
return root;
};
8.填充每个节点的下一个右侧节点指针 II
117. 填充每个节点的下一个右侧节点指针 II-中等
跟上一题同样的逻辑,但不知道为什么报错
2022.11.20更新:又看一遍这道题,换了另一个题解,还是报错。去题解中的评论区看了一下,好像是JS的解法就会抛出异常
9.二叉树的最大深度
层序遍历统计
var maxDepth = function(root) {
// 不用ans 定义height 后面每遍历一层 height++即可
const queue = [], ans = [];
if(!root) return 0;
queue.push(root);
while(queue.length) {
let size = queue.length;
let temp = [];
while(size--) {
let node = queue.shift();
temp.push(node.val);
node.left && queue.push(node.left);
node.right && queue.push(node.right);
}
ans.push(temp);
}
return ans.length;
};
递归
var maxDepth = function(root) {
const getDepth = function(root) {
if(!root) return 0;
return Math.max(getDepth(root.left), getDepth(root.right)) + 1;
}
return getDepth(root);
};
10.二叉树的最小深度
当左右孩子同时为空时就说明遍历到叶子节点了,就直接返回此时的高度即可
var minDepth = function(root) {
if(!root) return 0;
const queue = [root];
let height = 0;
while(queue.length) {
height++;
let size = queue.length;
while(size--) {
let node = queue.shift();
node.left && queue.push(node.left);
node.right && queue.push(node.right);
if(!node.left && !node.right) {
return height;
}
}
}
return height;
};