[路飞]_leetcode刷题_199. 二叉树的右视图

648 阅读1分钟

题目

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