LeetCode - 199. 二叉树的右视图

该博客介绍了如何通过广度优先搜索(BFS)算法来获取二叉树每一层最右侧的节点,即二叉树的右视图。博主详细解释了算法思路,包括维护当前层和下一层节点数的指针,并在当前层节点数为0时添加最右侧节点到结果列表。文章还提供了复杂度分析,时间复杂度为O(n),空间复杂度与树的节点数相关。代码展示了一个具体的Java实现。
摘要由CSDN通过智能技术生成

题目

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

思路

右视图就是每层的最右侧节点。

广度优先遍历,每层最后一个节点加入到列表中。

具体实现方法:
在广度优先的基础上,维护两个指针:
numsOfThisLevel: 代表 Queue 中本层的节点数,
numsOfNextLevel:代表 Queue 中下一层的节点数。
每当从队列中取出一个节点 node 时,numsOfThisLevel 减 1,
每当将 node 的左节点或者右节点加入队列是,numsOfNextLevel 加 1。
直到 numsOfThisLevel 为 0 是,这时 node 为本层最右侧节点,加入列表中,
并且将 numsOfThisLevel 下移一层(等于 numsOfNextLevel),
numsOfNextLevel 重置为 0.

复杂度分析

假设树有 n 个节点。

  • 时间复杂度O(n),遍历整棵树。
  • 空间复杂度O(n),空间复杂度与整棵树的节点数相关。

代码

class Solution {
       public List<Integer> rightSideView(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        bfs(root,res);
        return res;
    }

    private static void bfs(TreeNode root, List<Integer> res) {
        Queue<TreeNode> queue = new LinkedList<>();
        if (root == null) {
            return;
        }
        queue.add(root);
        // 在队列中的节点个数
        int numsOfThisLevel = 1;
        int numsOfNextLevel = 0;

        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            numsOfThisLevel--;
            if (node.left != null) {
                queue.offer(node.left);
                numsOfNextLevel++;
            }
            if (node.right != null) {
                queue.offer(node.right);
                numsOfNextLevel++;
            }
            if (numsOfThisLevel == 0){
                res.add(node.val);
                numsOfThisLevel = numsOfNextLevel;
                numsOfNextLevel = 0;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值