二叉树(广度优先搜索)
队列 先入先出 适合广度优先遍历
栈 先入后出 适合深度优先遍历
if(!root) 意思是如果root为空
if(currentNode.left)意思是 如果currentNode.left非空,就执行下面的草做
一.实现广度优先遍历(把二叉树中的值取出放到队列里
class TreeNode{
constructor(value){
this.value = value;
this.left = null;
this.right = null;
}
}
function bfs(root){
if(!root) return [];
const queue = [root];
const result = [];
while(queue.length>0){
const currentNode =queue.shift();//从队列中取出
result.push(currentNode.value);
if(currentNode.left){
queue.push(currentNode.left);
}
if(currentNode.right){
queue.push(currentNode.right);
}
}
return result;
}
二.二叉树的右视图
一个queue存放当前层节点,一个result队列存放最右边的节点,数据结构都是队列。
function rightSideView(root){
if(!root) return [];
const queue = [root];
const result = [];
while(queue.length>0){
//queue是动态变化的,所以要加一个变量,固定当前层节点数
levelSize = queue.length;
for(let i=0;i<levelSize;i++){
const currentNode = queue.shift();
if(i===levelSize-1){
result.push(currentNode.value);
}
if(currentNode.left){
queue.push(currentNode.left);
}
if(currentNode.right){
queue.right(currentNode.right);
}
}
}
return result;
}
三.最大层和,返回最大层数
初始最大值为-Inifity
初始累加和为0
当前层号是0,初始化,因为第一次赋值对应过去的那个层数已经++了,更新完才能对应上。
var maxLevelSum = function(root) {
if(!root) return [];
const queue=[root];
let maxResult = -Infinity;
let currLevel = 0;
let maxLevel = 1;
while(queue.length>0){
const levelSize=queue.length;
let currResult=0;
currLevel++;
for(let i=0;i<levelSize;i++){
const curr = queue.shift();
currResult+=curr.val;
if(curr.left){
queue.push(curr.left);
}
if(curr.right){
queue.push(curr.right);
}
}
//还要更新层号
if(currResult>maxResult){
maxResult = currResult;
maxLevel = currLevel;
}
}
return maxLevel;
}