题目
199. 二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:
输入: [1,null,3]
输出: [1,3]
示例 3:
输入: []
输出: []
思路:
广度优先遍历。
在广度优先的基础上,我们将每一层的最后一个节点保存到数组里,最后返回数组即可
代码如下:
/**
* @param {TreeNode} root
* @return {number[]}
*/
var rightSideView = function(root) {
if(!root) return []
let queue = [];
queue.push(root);
res = [];
while(queue.length > 0){
let size = queue.length;
while(size){
let node = queue.shift();
if(size == 1){
res.push(node.val);
}
if(node.left) queue.push(node.left);
if(node.right) queue.push(node.right);
size--;
}
}
return res;
};
思路2:
深度优先遍历。
我们采用前序遍历的倒序,也就是根右左,同时我们要记录二叉树的深度depth,默认depth = 1,含义是,我们目前即将要遍历的深度是第1层,
然后我们维护一个结果数组,每进入一层新的深度,就把这一层第一个遍历的节点放进去。
现在关键问题是如何判断当前节点是这一层的第一个节点?
- 我们之所以采用前序遍历的倒序,就是因为这样的话每一层的最右边的节点一定是第一次被遍历
- 我们有深度depth,我们当前遍历的深度如果大于结果数组res的长度的话,说明这一层我们第一次来
有以上两点,我们就可以开始写代码了
代码如下:
/**
* @param {TreeNode} root
* @return {number[]}
*/
var rightSideView = function(root) {
res = [];
DFS(root,0)
return res;
};
function DFS(root,depth){
if(!root) return ;
if(depth == res.length){
res.push(root.val)
}
depth++;
DFS(root.right,depth);
DFS(root.left,depth);
}