文章目录

  • 一、二叉树的层序遍历
  • 二、二叉树的右视图
    • 1、方法一:广度优先搜索
    • 2、方法二:深度优先搜索
  • 三、二叉树的左视图
  • 四、二叉树的俯视图
  • 五、判断是否是完全二叉树

一、二叉树的层序遍历

  • 本题采用非递归的方式进行层序遍历。使用队列来实现。

  • 先判断根节点是否为空,如果不为空就入队,接着再把根节点的左右子树入队,然后都出队,

    //层序遍历//可以引伸出的题目//求树的最大宽度,求树的左视图void levelOrder2(TreeNode root){if(root==null)return;Queue<TreeNode> queue=new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){TreeNode cur=queue.poll();System.out.println(cur.val+" ");//如果不为空,就放到队列里面,然后弹出去,在打印它if(cur.left!=null){queue.offer(cur.left);}if(cur.right!=null){queue.offer(cur.right);}}}

二、二叉树的右视图

题目》》》》》》》》》》》

1、方法一:广度优先搜索

  • 利用广度优先搜索进行层次遍历
  • 记录下每层最后一个元素
  • 时间复杂度:O(n) 因为每个节点都入队和出队了一次
  • 空间复杂度:O(n) 因为通过额外的队列空间来存储每一层的节点
class Solution{public List<Integer> rightSideView(TreeNode root){List<Integer> res=new ArrayList<>();//res里面存放右视图的节点if(root==null){return res;//如果结点是空,直接返回null的res}Queue<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(node.left!=null){queue.offer(node.left);//将当前节点的左孩子入队}if(node.right!=null){queue.offer(node.right);//将当前节点的右孩子入队}if(i==size-1){ //将当前层的最后一个节点放入结果列表res.add(node.val);}}}return res;}
}

2、方法二:深度优先搜索

  • 按照根节点-》右子树-》左子树的顺序访问,可以保证每层都是最先访问最右边的节点。
class Solution{List<Integer> res =new ArrayList<>();//定义结果列表public List<Integer> rightSideView(TreeNode root){dfs(root,0);//从根节点开始访问,深度为0return res;}private void dfs(TreeNode root,int depth){if(root==null)return;if(depth==res.size())res.add(root.val);//如果当前节点所在的深度还没有出现在res里面,// 说明在该深度下当前节点是第一个被访问的节点,因此将该节点加入res当中depth++;dfs(root.right,depth);//递归访问右子树dfs(root.left,depth);//递归访问左子树}
}

三、二叉树的左视图

```javascript
class Solution{public List<Integer> rightSideView(TreeNode root){List<Integer> res=new ArrayList<>();//res里面存放右视图的节点if(root==null){return res;//如果结点是空,直接返回null的res}Queue<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(node.left!=null){queue.offer(node.left);//将当前节点的左孩子入队}if(node.right!=null){queue.offer(node.right);//将当前节点的右孩子入队}if(i==0){ //将当前层的最后一个节点放入结果列表res.add(node.val);}}}return res;}
}

四、二叉树的俯视图

思路:使用二叉树的层序遍历,倒着往上铺,则上层的元素会覆盖下层的元素。

在这里插入代码片

五、判断是否是完全二叉树

    // 判断一棵树是不是完全二叉树boolean isCompleteTree(TreeNode root){if(root==null)return true;Queue<TreeNode> queue=new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){TreeNode cur=queue.poll();if(cur!=null){//只要节点不为空,就把子节点全部放入队列当中queue.offer(cur.left);queue.offer(cur.right);}else{break;}}while(queue.isEmpty()){TreeNode cur=queue.peek();if(cur!=null)return false;else queue.poll();}return true;}

【Java刷题】04_二叉树的左右视图相关推荐

  1. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  2. 力扣刷题之二叉树的层序遍历

                                                      Welcome to you, 每日一刷系列 二叉树的层序遍历 二叉树的层序遍历II 二叉树的右视图 ...

  3. Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...

    TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...

  4. 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类...

    不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概 ...

  5. JAVA刷题方法整理

    JAVA刷题方法整理 一.String->String[] 利用String.split()实现 注:在使用String.split 方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我 ...

  6. 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数...

    不多说,直接上干货! 通过 牛客网Java刷题知识点之构造函数是什么.一般函数和构造函数什么区别呢.构造函数的重载.构造函数的内存图解 我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会 ...

  7. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  8. 二、lintcode刷题记录--二叉树的路径和

    LintCode刷题记录---二叉树的路径和(效率可能没有那些专业的高,主要是代码结构比较简单) ) 题目地址:http://www.lintcode.com/zh-cn/problem/binary ...

  9. java刷题--518零钱兑换II

    java刷题--518零钱兑换II 题目 代码 结果 题目 代码 class Solution {public int change(int amount, int[] coins) {int[] d ...

  10. 牛客网java刷题笔记2019-1-4

    牛客网java刷题笔记 2019-1-4 1.java中可以用类中构造器调用其他类构造器(这个和C++中构造函数很类似)用于初始化程序变量值, 构造器和方法的区别: 功能和作用的不同 构造器是为了创建 ...

最新文章

  1. vue绑定数据之前 会看到源代码
  2. 时序图、活动图、状态图、协作图的区别
  3. 用账号连无线网怎么连接网络连接服务器,路由器怎么共用一个宽带账号
  4. mvc html.radiobutton 选中,asp.net-mvc - 如何使用RadioButtonFor选择单选按钮中的任何一个并包含if else语句 - 堆栈内存溢出...
  5. 【CS231n_2017】2-Image Classification
  6. 远程连接Linux密码特殊字符,[转载]linux shell 命令_特殊字符
  7. C++两个类互相引用,如何处理最好
  8. 基于51单片机开发板8*8LED矩阵的贪吃蛇程序
  9. MODBUS TCP转PROFINET网关快速配置手册
  10. 计算机网络cs144之lab0
  11. 大气科学领域必备的模型软件汇总丨WRF、WRF-CMAQ、WRF-Chem、WRF-Hydro、WRF DA、PMF、MCM、CAMx、SMOKE、CMIP6等
  12. Hibernate criterion 方法总结
  13. 编译原理 —— 什么是语法分析
  14. 到底应不应该【跨专业】考研计算机?希望大么?
  15. numpy之vstack()、hstack()
  16. 动力节点 mysql 郭鑫 34道经典的面试题
  17. 市盈率不足20倍 34只大盘蓝筹股尽显低估值效应
  18. 一、JSX语法的基本使用
  19. 小鲁客栈---预告篇
  20. AIR32F103(七) AIR32F103CBT6/CCT6启用96K内存

热门文章

  1. spring概念理解之IOC(控制反转)
  2. 中文常用停用词表(哈工大停用词表、百度停用词表
  3. BAT大牛分享如何在最短的时间升职为阿里Java架构师
  4. html双击变成可编辑状态,JS实现双击编辑可修改状态的方法
  5. 某银行无线网络频繁掉线重认证分析、解决方案及抓包经验分享
  6. python3 爬虫 爬取华为应用市场 APP应用评论(一)爬取全部评论——学霸君
  7. hdu 4489(排列组合+DP)
  8. JAVA基础之类和对象
  9. 数字联盟可信ID 3.0 正式上线升级 用真实数据助力企业增长
  10. 各种二手及全新的光纤熔(融)接机,OTDR,光测试仪器仪表等