LeetCode199 二叉树的右视图

题目

给定一个二叉树的 根节点 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 

方法

深度优先遍历法

用根右左的顺序深度优先遍历,每层的第一个数添加到数组中

  • 时间复杂度:O(n),n为节点个数
  • 空间复杂度:O(n)
class Solution {
    List<Integer> ans = new ArrayList<>();
    int maxDeepth = -1;
    public List<Integer> rightSideView(TreeNode root) {
        dfs(root,0);
        return ans;
    }
    private void dfs(TreeNode root,int deepth){
        if(root==null) return;
        if(maxDeepth<deepth){
            ans.add(root.val);
            maxDeepth = deepth;
        }
        dfs(root.right,deepth+1);
        dfs(root.left,deepth+1);
    }
}

广度优先遍历法

用层序遍历,保存每层最后一个

  • 时间复杂度:O(n),n为节点个数
  • 空间复杂度:O(n)
class Solution {
    List<Integer> ans = new ArrayList<>();
    public List<Integer> rightSideView(TreeNode root) {
        if(root==null) return ans;
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()){
            int size = queue.size();
            for(int i=0;i<size;i++){
                TreeNode node = queue.poll();
                if(i==size-1){
                    ans.add(node.val);
                }
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
            }
        }
        return ans;
    }
}
上一篇:JSP web应用程序开发教程实验一


下一篇:Linux命令之保存命令结果到文件并且输出到屏幕tee