zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Leetcode No.199 二叉树的右视图

2023-03-20 14:56:49 时间

一、题目描述

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

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

示例 2: 输入: [1,null,3] 输出: [1,3]

示例 3: 输入: [] 输出: []

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

二、解题思路

No.102 二叉树的层序遍历:https://xingqijiang.blog.csdn.net/article/details/119582945

No.107 二叉树的层序遍历 II:https://blog.csdn.net/jxq0816/article/details/119619353

我们可以对二叉树进行层次遍历,那么对于每层来说,最右边的结点一定是最后被遍历到的。二叉树的层次遍历可以用广度优先搜索实现。

执行广度优先搜索,左结点排在右结点之前,这样,我们对每一层都从左到右访问。因此,只保留每一层最后访问的结点,我们就可以在遍历完整棵树后得到每个深度最右的结点。

上图表示了一个示例,红色结点自上而下组成答案,边缘以访问顺序标号。

三、代码

import utils.TreeNode;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        if(root==null){
            return new ArrayList<Integer>();
        }
        List rs=new ArrayList<Integer>();
        Queue<TreeNode> queue = new ArrayDeque();
        queue.add(root);
        while(queue.isEmpty()==false){
            int size = queue.size();
            for(int i=0;i<size;i++){
                TreeNode parent=queue.poll();
                if(parent.left!=null){
                    queue.add(parent.left);
                }
                if(parent.right!=null){
                    queue.add(parent.right);
                }
                if(i==size-1){
                    rs.add(parent.val);
                }
            }
        }
        return rs;
    }
}

四、复杂度分析

时间复杂度 : O(n)。每个节点最多进队列一次,出队列一次,因此广度优先搜索的复杂度为线性。

空间复杂度 : O(n)。每个节点最多进队列一次,所以队列长度最大不不超过 n,所以这里的空间代价为 O(n)。