leetcode
 
解题思路
二叉树的右视图需要返回从右侧视角观察时,每层最右边的节点值。核心思路是层序遍历(BFS):
- 层序遍历基础:按层处理节点,每层从左到右遍历
 
- 右视图特性:每层最后一个节点即右视图可见节点
 
- 方向优化:优先遍历右子树可减少后续处理,但非必需(标准BFS即可实现)
 
区别于普通层序遍历,只需在每层遍历时记录最后一个节点的值
关键步骤
- 初始化队列:根节点入队(非空时)
 
- BFS循环:
- 获取当前层节点数
levelSize 
- 遍历该层所有节点:
 
- 记录当前层最后一个节点的值
 
 
- 结果返回:按层存储最右节点值的切片
 
代码实现
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⌉
关键点总结
- 队列核心作用:先进先出保证层序访问顺序
 
- 分层控制:
levelSize = len(queue)精准分割每层节点 
- 右视图捕获:每层最后一个节点即右视图节点(
i == levelSize-1) 
- 空树处理:初始判空避免运行时错误
 
- 子节点顺序:左子树先入队保证层序从左向右
 
- 高效实现:单次遍历完成,无额外反转操作