题目描述

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

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

解题思路

思路一:采用两个队列的方法,第一个队列记录第一层,第二个队列记录第二层。知道两个队列都为空的时候,遍历结束。时间复杂度和空间复杂度都是O(N)

但这种方法有一个不太好的地方,就是代码偏多,需要定义两个队列。面试官姐姐可能并不喜欢你的方法。

思路二:采用一个队列+计数的方法,每个层次的遍历,之前,都先统计一下这一层有多少个节点。如何统计呢?其实就是当时队列中元素的个数。例如,队列有n个节点,当这一层级的第n个节目点出栈的时候,将该节点计入结果。

解题核心代码

class Solution {public List<Integer> rightSideView(TreeNode root) {LinkedList<Integer> res = new LinkedList<>();if (root==null){return res;}LinkedList<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()){int size = queue.size();for (int i = 0;i<size;i++){if (i==size-1){res.offer(queue.peek().val);}TreeNode node = queue.poll();if (node.left!=null){queue.offer(node.left);}if (node.right!=null){queue.offer(node.right);}}}return res;}
}

解题延申——求左视图

求左视图也非常简单

if (i==size-1)  这一行 改为 if (i==0)

即可。

解题本地调试代码


import java.util.LinkedList;
import java.util.List;
import java.util.Queue;public class Solution199 {public static void main(String[] args) {String line = "[1,2,3,null,5,null,4]";TreeNode root = stringToTreeNode(line);List<Integer> retRight = new Solution199().rightSideView(root);List<Integer> retLeft = new Solution199().leftSideView(root);String outRight = integerArrayListToString(retRight);String outLeft = integerArrayListToString(retLeft);System.out.println("二叉树为:" + line);System.out.println("右视图为:" + outRight);System.out.println("左视图为:" + outLeft);}public static TreeNode stringToTreeNode(String input) {input = input.trim();input = input.substring(1, input.length() - 1);if (input.length() == 0) {return null;}String[] parts = input.split(",");String item = parts[0];TreeNode root = new TreeNode(Integer.parseInt(item));Queue<TreeNode> nodeQueue = new LinkedList<>();nodeQueue.add(root);int index = 1;while (!nodeQueue.isEmpty()) {TreeNode node = nodeQueue.remove();if (index == parts.length) {break;}item = parts[index++];item = item.trim();if (!item.equals("null")) {int leftNumber = Integer.parseInt(item);node.left = new TreeNode(leftNumber);nodeQueue.add(node.left);}if (index == parts.length) {break;}item = parts[index++];item = item.trim();if (!item.equals("null")) {int rightNumber = Integer.parseInt(item);node.right = new TreeNode(rightNumber);nodeQueue.add(node.right);}}return root;}public static String integerArrayListToString(List<Integer> nums, int length) {if (length == 0) {return "[]";}StringBuilder result = new StringBuilder();for (int index = 0; index < length; index++) {Integer number = nums.get(index);result.append(Integer.toString(number)).append(", ");}return "[" + result.substring(0, result.length() - 2) + "]";}public static String integerArrayListToString(List<Integer> nums) {return integerArrayListToString(nums, nums.size());}public List<Integer> rightSideView(TreeNode root) {LinkedList<Integer> res = new LinkedList<>();if (root == null) {return res;}LinkedList<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();for (int i = 0; i < size; i++) {if (i == size - 1) {res.offer(queue.peek().val);}TreeNode node = queue.poll();if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}}return res;}public List<Integer> leftSideView(TreeNode root) {LinkedList<Integer> res = new LinkedList<>();if (root == null) {return res;}LinkedList<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();for (int i = 0; i < size; i++) {if (i == 0) {res.offer(queue.peek().val);}TreeNode node = queue.poll();if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}}return res;}
}class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) {this.val = val;}TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}

输出为

Leetcode-199二叉树的右视图(二叉树左视图)相关推荐

  1. 47、打印二叉树的右视图 和 左视图

    右视图思路: 层次遍历二叉树: 将每一层的最后一个节点值保存到结果数组: 左视图思路: 层次遍历二叉树: 将每一层的第一个节点值保存到结果数组: (1)右视图代码实现 /*** Definition ...

  2. Leetcode 199.二叉树的右视图

    Time: 20190903 Type: Medium 题目描述 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5 ...

  3. 199. 二叉树的右视图

    199. 二叉树的右视图: 题目链接 :199. 二叉树的右视图 题目: 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值 思路: BFS( ...

  4. LeetCode-笔记-199. 二叉树的右视图——BFS广度优先搜索

    LeetCode-笔记-199. 二叉树的右视图 199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,n ...

  5. [Leedcode][JAVA][第199题][二叉树的右视图][BFS][DFS][前中后序遍历]

    [问题描述]199.二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值.示例:输入: [1,2,3,null,5,null,4] 输出: [1, ...

  6. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  7. 牛客题霸 [输出二叉树的右视图] C++题解/答案

    牛客题霸 [输出二叉树的右视图] C++题解/答案 题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 题解: 分两个过程: 先用前序遍历+中序遍历恢复二叉树,这个应该都会. ...

  8. 创建二叉树的代码_解二叉树的右视图的两种方式

    给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 问题分析 这题说的很明白,就是站在一棵二叉树的右边,你所能看到的结点值.对于二叉树的遍历,前面有简单 ...

  9. 二叉树(二):判断是不是二叉搜索树、判断是不是完全二叉树、判断是不是平衡二叉树、二叉搜索树的最近公共祖先、在二叉搜索树中找到两个节点的最近公共祖先、序列化二叉树、重建二叉树、输出二叉树的右视图

    目录 一.判断是不是二叉搜索树 1.1 题目 1.2 题解 二.判断是不是完全二叉树 2.1 题目 2.2 题解 三.判断是不是平衡二叉树 3.1 题目 3.2 题解 四.二叉搜索树的最近公共祖先 4 ...

最新文章

  1. java web 哪些方法不能被从写_JAVA_WEB面试题
  2. cxgrid动态创建列
  3. 干货 | SpringBoot注解大全,值得收藏
  4. SAP Spartacus的Responsive和adaptive特性
  5. 跨性别,你所不知道的事
  6. 洛谷P3402 【模板】可持久化并查集
  7. Golang channel 快速入门
  8. 如何引用XML文件生成C#类
  9. linux系统调用劫持隐藏进程,linux 下隐藏进程的一种方法及遇到的坑
  10. BAT命令手动_自动启动和禁用服务
  11. [摘抄]3D电视原理
  12. 在硬盘安装超小体积的迷你 WinPE(30MB)系统
  13. Mujoco的关节与外力和驱动器
  14. ORACLE索引分裂(enq: TX - index contention)
  15. java全局搜素快捷键_eclipse全局搜索快捷键是什么
  16. hibernate HQL 使用from (select ……)子查询的方法
  17. C语言编程实现程输出所有玫瑰花数
  18. 案例分析 | 茶饮如何积累3500万私域流量实现弯道超车?
  19. python蓝牙控制手机打电话_通过蓝牙连接车机和手机,实现打电话功能实现
  20. 毕业设计 - java web 进销存管理系统的设计与实现【源码+论文】

热门文章

  1. python udp传输 报错:OSError: [WinError 10040] 一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户用于接收数据报的缓冲区比数据报小。
  2. Python numpy hstack() vstack() stack() dstack() vsplit() concatenate()函数用法和区别
  3. spss主成分综合得分_【2020.】这种主成分得分图SPSS能够实现吗?
  4. flex 还有人用么_11月LSAT-FLEX:考或不考对今年的申请有什么影响?
  5. 【SSM】Kisso实用教程之验证码简单使用(一)
  6. IDEA的UML图详细介绍(二)
  7. header中Content-Disposition的作用与使用方法
  8. 解决Linux报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录
  9. java开关用法_如何在Java中使用带开关盒的枚举?
  10. python时间序列预测报错_python如何做时间序列