【LeetCode】199. 二叉树的右视图

leetcode

 

解题思路

二叉树的右视图需要返回从右侧视角观察时,每层最右边的节点值。核心思路是​​层序遍历(BFS)​​:

  1. ​​层序遍历基础​​:按层处理节点,每层从左到右遍历
  2. ​​右视图特性​​:每层最后一个节点即右视图可见节点
  3. ​​方向优化​​:优先遍历右子树可减少后续处理,但非必需(标准BFS即可实现)

区别于普通层序遍历,只需在每层遍历时记录最后一个节点的值

关键步骤

  1. ​​初始化队列​​:根节点入队(非空时)
  2. ​​BFS循环​​:
    • 获取当前层节点数levelSize
    • 遍历该层所有节点:
      • 队首节点出队
      • 左右子节点入队(若存在)
    • 记录当前层最后一个节点的值
  3. ​​结果返回​​:按层存储最右节点值的切片

代码实现

type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

func rightSideView(root *TreeNode) []int {
    if root == nil {
        return []int{} // 空树直接返回空切片
    }

    // 初始化队列和结果集
    queue := []*TreeNode{root}
    res := []int{}

    for len(queue) > 0 {
        levelSize := len(queue) // 当前层节点数
        var lastNodeVal int     // 存储当前层最后一个节点值

        // 遍历当前层所有节点
        for i := 0; i < levelSize; i++ {
            node := queue[0]  // 队首出队
            queue = queue[1:] // 更新队列

            // 记录最后一个节点值(每层最后遍历到的节点)
            if i == levelSize-1 {
                lastNodeVal = node.Val
            }

            // 子节点入队(左子树先入队保证层序从左到右)
            if node.Left != nil {
                queue = append(queue, node.Left)
            }
            if node.Right != nil {
                queue = append(queue, node.Right)
            }
        }
        // 当前层最右节点值加入结果
        res = append(res, lastNodeVal)
    }
    return res
}

示例测试

func main() {
    // 示例1: [1,2,3,null,5,null,4]
    root1 := &TreeNode{Val: 1}
    root1.Left = &TreeNode{Val: 2}
    root1.Right = &TreeNode{Val: 3}
    root1.Left.Right = &TreeNode{Val: 5}
    root1.Right.Right = &TreeNode{Val: 4}
    fmt.Println(rightSideView(root1)) // [1,3,4]

    // 示例2: [1,2,3,4,null,null,null,5]
    root2 := &TreeNode{Val: 1}
    root2.Left = &TreeNode{Val: 2}
    root2.Right = &TreeNode{Val: 3}
    root2.Left.Left = &TreeNode{Val: 4}
    root2.Left.Left.Right = &TreeNode{Val: 5}
    fmt.Println(rightSideView(root2)) // [1,3,4,5]

    // 示例3: [1,null,3]
    root3 := &TreeNode{Val: 1}
    root3.Right = &TreeNode{Val: 3}
    fmt.Println(rightSideView(root3)) // [1,3]

    // 示例4: 空树
    var root4 *TreeNode
    fmt.Println(rightSideView(root4)) // []
}

复杂度分析

指标说明
​​时间复杂度​​ O(n) 每个节点访问1次
​​空间复杂度​​ O(n) 队列存储最宽层节点

​​注​​:最坏情况为完美二叉树,叶子层节点数达⌈n/2⌉

关键点总结

  1. ​​队列核心作用​​:先进先出保证层序访问顺序
  2. ​​分层控制​​:levelSize = len(queue)精准分割每层节点
  3. ​​右视图捕获​​:每层最后一个节点即右视图节点(i == levelSize-1
  4. ​​空树处理​​:初始判空避免运行时错误
  5. ​​子节点顺序​​:左子树先入队保证层序从左向右
  6. ​​高效实现​​:单次遍历完成,无额外反转操作
posted @ 2025-06-08 12:55  云隙之间  阅读(83)  评论(0)    收藏  举报