[路飞]_二叉树的右视图

201 阅读2分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战

leetcode-199 二叉树的右视图

题目介绍

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

示例1

image.png

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

示例2

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

示例3

输入: []
输出: []

提示:

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

解题思路

此题可以用深度优先和广度优先遍历出二叉树每一层的节点,然后将每一层最右边的节点按顺序插入到结果数组中,即可完成此题

广度优先

广度优先方法是利用队列保存上一层的所有节点,然后遍历上一层的所有节点,将每个节点左右子节点分别插入到队列中,当遍历完每一层的所有节点时,将最后的节点(也就是每一层最右边的节点)插入到结果数组中

解题步骤

  1. 如果此二叉树是空树,则直接返回 []
  2. 定义结果数组 res,定义存放每一层节点的队列 queue,并将第一层的根节点 root 插入队列中
  3. 定义 n 保存上一层的节点数,依次从 queue 队列中弹出 n 个节点,并将每个节点的左右节点插入到 queue
  4. 当遍历到每一层的最后一个节点时,将该节点的值插入到结果数组 res
  5. 重复步骤 3-4,直到 queue 队列为空,说明遍历完了整棵树,直接返回 res 数组即可

二叉树的右视图.gif

解题代码

var rightSideView = function(root) {
    if (!root) return []
    const res = []
    let queue = [root]
    while (queue.length) {
        let n = queue.length
        let node = null
        while (n--) {
            node = queue.shift()
            node.left && queue.push(node.left)
            node.right && queue.push(node.right)
        }
        res.push(node.val)
    }
    return res
};

深度优先

深度优先方法从二叉树的右子树开始遍历,如果结果数组对应层数的下标没有值,则将节点的值插入到结果数组中

解题步骤

  1. 如果此二叉树是空树,则直接返回 []
  2. 定义结果数组 ans,定义当前层数 depth = 0
  3. 从根节点开始递归,如果 ans[depth] 没有值,则将节点值插入到该位置
  4. 继续遍历右子树,层数 depth + 1
  5. 继续遍历左子树,层数 depth + 1
  6. 最后返回 ans 数组

二叉树的右视图(1).gif

解题代码

var rightSideView = function(root) {
    if (!root) return []
    const ans = []
    let depth = 0
    dfs(root, depth, ans)
    return ans
};

var dfs = function(root, k, ans) {
    if (!ans[k]) ans[k] = root.val
    root.right && dfs(root.right, k + 1, ans)
    root.left && dfs(root.left, k + 1, ans)
}