[路飞]_算法·每日解读--二叉树的右视图

125 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

题解: 199. 二叉树的右视图

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

示例1:

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

理解题意: 注意在这里,返回右视图,并非返回的是root.right。而是给定一个二叉树,从右侧的角度进行观察,所能看到的数。(右节点为空时,看到的为左节点的值,右节点depth小于左节点的depth时,看到的是左节点的depth下对应的数)

示例2:

输入:[1,2,3,null,5,4,null,null,null,null,8]  //8为root为3左子树4的右节点
//注意节点的left和right结构
输出:[1,3,4,8]

示例3:

输入:[1,2,3,null,5,4,null,null,8,null,null]  //8为root为5的右节点
输出:[1,3,4,8]

思路方法:

解决此题时应当考虑到两个方面:

  1. 子树的depth对视图的影响
  2. 子树右节点为null时,右视图看到的为左节点的value

误区:第一直觉思维容易只考虑rootrightrightright

var rightSideView = function(root) {
    if(!root) return [];
    let depthMap = new Map(); 
    //因为要考虑到depth和value的两个因素,
    //所以选择了map进行key和value的存储
    let queue = [[root,0]];
    //初始化queue二位数组,用于存储子树的节点
    while(queue.length){
        //通过shift()数组操作方法,从头部取出元素,(一定要注意元素的取出顺序)
        //取出头部元素后,queue的length自减,用于循环检验
        let [{val,left,right},depth] = queue.shift();
        //取出后进行值拆解,分别赋予value、left、right
        depthMap.set(depth,val);
        //将获取到的depth和value进行set添加到depthMap
        depth +=1;
        //添加完成后,开始查询遍历下一层的子树结构
        //注意在接下来的left和right操作时,存在一个相同的因素:depth
        //在下次的set时,当存在key(depth)时,
        //会将后面的key所对应的vlaue覆盖前面的value
        if(left){
        //如果left存在,则将left和对应的depth先行push到queue的尾部
            queue.push([left,depth]);
        }
        if(right){
        //如果right存在,接着将right和对应的depthpush到queue的尾部
            queue.push([right,depth]);
        }
    }
    return [...depthMap.values()];
};

知识点回顾:

  1. 函数递归的使用

  2. 多个参数获取与赋值

    cosnt array = [num1 , num2 , num3]
    
    let {value1 , value2, value3} = array;
    
    //value1 = num1 、value2 = num2 、value3 = num3
    
    
  3. 字符串操作方法和属性==》

    1. shift()unshift()
    2. push()pop()
  4. Map()函数的 set()方法、值的获取values()方法

  5. 展开运算符...

👆 👆 以上就是个人对【二叉树的右视图】的代码解法和方法解读。

迷惑重重,一看上头,一键三连哟!!!