一起养成写作习惯!这是我参与「掘金日新计划 · 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]
思路方法:
解决此题时应当考虑到两个方面:
- 子树的
depth对视图的影响- 子树右节点为
null时,右视图看到的为左节点的value
误区:第一直觉思维容易只考虑root的right的right的right
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()];
};
知识点回顾:
-
函数递归的使用
-
多个参数获取与赋值
cosnt array = [num1 , num2 , num3] let {value1 , value2, value3} = array; //value1 = num1 、value2 = num2 、value3 = num3 -
字符串操作方法和属性==》
shift()、unshift()push()、pop()
-
Map()函数的set()方法、值的获取values()方法 -
展开运算符
...
👆 👆 以上就是个人对【二叉树的右视图】的代码解法和方法解读。
迷惑重重,一看上头,一键三连哟!!!