剑指Offer|LCR 046.二叉树的右视图

LCR 046.二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

剑指Offer|LCR 046.二叉树的右视图_第1张图片

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100

法1:

**分析:**和LCR 045.找树左下角的值类似

如果root为空,直接返回[];

定义两个队列queue1和queue2,默认将root加入queue1,令result默认为[root.val]。

如果queue1不为空,则遍历:

  • 将首元素出队列queue1,并将当前节点的左右孩子入队列(获取下层的节点);
  • 当queue1的长度为0 的时候,表明当前层次的节点都遍历结束,更新一下queue1为下一层次节点,queue2初始为空,判断queue1是否大于0 ,有节点的话需要更新一下result,每次将queue1最右边的节点的值加入队列。
var rightSideView = function(root) {
    if(root === null) return [];
    let queue1 = []; 
    let queue2 = []; 
    let result = [];
    result.push(root.val);
    queue1.push(root);

    while(queue1.length > 0){
        let node = queue1.shift(); // 移除第一个元素
        // 如果有左子节点,加入队列2
        if(node.left !== null){
            queue2.push(node.left);
        }

        if(node.right !== null){
            queue2.push(node.right);
        }

        // 如果当前队列为空,表示当前层已处理完毕
        if(queue1.length === 0){
            // 当前层处理完后,交换队列
            queue1 = queue2;
            queue2 = [];

            // 如果 queue1不为空,更新最左节点的值为当前队列的第一个节点
            if(queue1.length > 0){
                result.push(queue1[queue1.length - 1].val);
            }
        }
    }
	return result;
};

你可能感兴趣的:(剑指Offer,算法,算法,javascript)