LeetCode - 199. 二叉树的右视图

题目

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

思路

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

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

具体实现方法:
在广度优先的基础上,维护两个指针:
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;
            }
        }
    }
}

你可能感兴趣的:(算法,二叉树,leetcode,算法)