二叉树(广度优先搜索)力扣1161,199

53 阅读1分钟

二叉树(广度优先搜索)

队列 先入先出 适合广度优先遍历

栈 先入后出 适合深度优先遍历

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;
}