【题目】从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

方法一:直接打印

  1. package com.exe7.offer;
  2.  
  3. import java.util.LinkedList;
  4. import java.util.Queue;
  5.  
  6. /**
  7. * 【题目】从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
  8. * @author WGS
  9. *
  10. */
  11. public class PrintBiTreeFromTopToBottom {
  12. static class TreeNode{
  13. int val=0;
  14. TreeNode left=null;
  15. TreeNode right=null;
  16. public TreeNode(int val){
  17. this.val=val;
  18. }
  19. }
  20.  
  21. public void printBiTreeFromTopToBottom(TreeNode headNode){
  22. if(headNode==null) return ;
  23. int nextLevelNodes=0;
  24. int toBoPrint=1;//设置个初始值
  25. Queue<TreeNode> queue=new LinkedList<TreeNode>();
  26. queue.add(headNode);
  27. while(!queue.isEmpty()){
  28. //1 打印
  29. TreeNode curNode=queue.poll();
  30. System.out.print(curNode.val+" ");
  31.  
  32. //2 添加左右结点
  33. if(curNode.left!=null){
  34. queue.add(curNode.left);
  35. nextLevelNodes++;//下层要打印的结点数+1
  36. }
  37. if(curNode.right!=null){
  38. queue.add(curNode.right);
  39. nextLevelNodes++;//下层要打印的结点数+1
  40. }
  41. //左右结点添加完后即打印完本层一个结点值,自动减1(要判断本层是否还有别的值)
  42. --toBoPrint;
  43. if(toBoPrint==0){//本层打印完
  44. System.out.println();//换行
  45. toBoPrint=nextLevelNodes;//下层要打印的结点数
  46. nextLevelNodes=0;//清0
  47. }
  48. }
  49.  
  50. }
  51. public static void main(String[] args) {
  52. PrintBiTreeFromTopToBottom p=new PrintBiTreeFromTopToBottom();
  53. TreeNode root = new TreeNode(8);
  54. TreeNode node1 = new TreeNode(6);
  55. TreeNode node2 = new TreeNode(10);
  56. TreeNode node3 = new TreeNode(5);
  57. TreeNode node4 = new TreeNode(7);
  58. TreeNode node5 = new TreeNode(9);
  59. TreeNode node6 = new TreeNode(11);
  60.  
  61. root.left = node1;
  62. root.right = node2;
  63. node1.left = node3;
  64. node1.right = node4;
  65. node2.left = node5;
  66. node2.right = node6;
  67.  
  68. p.printBiTreeFromTopToBottom(root);
  69. }
  70.  
  71. }

方法二:使用博主的方法(面试时候推荐此种方法,个别代码差异,思想一样)

  1. package com.exe7.offer;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.LinkedList;
  5. import java.util.Queue;
  6.  
  7. /**方法二:使用博主的方法(面试时候推荐此种方法,个别代码差异,思想一样)
  8. * 【题目】从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
  9. * @author WGS
  10. *
  11. */
  12. public class PrintBiTreeFromTopToBottom2 {
  13. static class TreeNode{
  14. int val=0;
  15. TreeNode left=null;
  16. TreeNode right=null;
  17. public TreeNode(int val){
  18. this.val=val;
  19. }
  20. }
  21.  
  22. public ArrayList<ArrayList<Integer>> printBiTreeFromTopToBottom(TreeNode headNode){
  23. ArrayList<ArrayList<Integer>> list=new ArrayList<>();//接收总共行的结点
  24. ArrayList<Integer> nodeList=new ArrayList<>();//接收每行结点
  25. if(headNode==null) return list;
  26. int nextLevelNodes=0;//下层要打印的结点数
  27. int toBoPrint=1;//设置个初始值
  28. Queue<TreeNode> queue=new LinkedList<TreeNode>();
  29. queue.add(headNode);
  30. while(!queue.isEmpty()){
  31. //1 打印
  32. TreeNode curNode=queue.poll();
  33. //System.out.print(curNode.val+" ");
  34. nodeList.add(curNode.val);
  35. //2 添加左右结点
  36. if(curNode.left!=null){
  37. queue.add(curNode.left);
  38. nextLevelNodes++;//下层要打印的结点数+1
  39. }
  40. if(curNode.right!=null){
  41. queue.add(curNode.right);
  42. nextLevelNodes++;//下层要打印的结点数+1
  43. }
  44. //左右结点添加完后即打印完本层一个结点值,自动减1(要判断本层是否还有别的值)
  45. --toBoPrint;
  46. if(toBoPrint==0){//本层打印完
  47. //System.out.println();//换行
  48. list.add(nodeList);
  49. toBoPrint=nextLevelNodes;//下层要打印的结点数
  50. nextLevelNodes=0;//清0
  51. nodeList=new ArrayList<>();
  52. }
  53. }
  54. return list;
  55.  
  56. }
  57. public static void main(String[] args) {
  58. PrintBiTreeFromTopToBottom2 p=new PrintBiTreeFromTopToBottom2();
  59. TreeNode root = new TreeNode(8);
  60. TreeNode node1 = new TreeNode(6);
  61. TreeNode node2 = new TreeNode(10);
  62. TreeNode node3 = new TreeNode(5);
  63. TreeNode node4 = new TreeNode(7);
  64. TreeNode node5 = new TreeNode(9);
  65. TreeNode node6 = new TreeNode(11);
  66.  
  67. root.left = node1;
  68. root.right = node2;
  69. node1.left = node3;
  70. node1.right = node4;
  71. node2.left = node5;
  72. node2.right = node6;
  73.  
  74. ArrayList<ArrayList<Integer>> getList=p.printBiTreeFromTopToBottom(root);
  75. for (ArrayList<Integer> arrayList : getList) {
  76. System.out.println(arrayList);
  77. }
  78. }
  79.  
  80. }

剑指offer系列33-----把二叉树打印成多行的更多相关文章

  1. 剑指offer系列32-----对称二叉树的判断

    [题目]请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. package com.exe7.offer; /** * [题目]请实现一个函 ...

  2. 剑指offer系列53---字符串转化成整数

    [题目]将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数 * []整数(32位)最大值:0X7fff ffff( 0111 1111 1111 1111 1111 1111 1111 1 ...

  3. 剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数

    题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 ...

  4. 剑指Offer:二叉树打印成多行【23】

    剑指Offer:二叉树打印成多行[23] 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 题目分析 Java题解 package tree; import java.uti ...

  5. 把二叉树打印成多行 牛客网 剑指Offer

    把二叉树打印成多行 牛客网 剑指Offer 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行 # class TreeNode: # def __init__(self, x) ...

  6. 【剑指Offer】把二叉树打印成多行 解题报告(Python)

    [剑指Offer]把二叉树打印成多行 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  7. 剑指Offer - 九度1368 - 二叉树中和为某一值的路径

    剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...

  8. 干货 | 剑指offer系列文章汇总

    下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现  剑指offer系列  始 剑指offer—灯管问题(1)  剑指offer—10人电梯(2)  ...

  9. 《剑指offer》从尾到头打印链表

    本题来自<剑指offer> 从尾到头打印链表 题目: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 方案一:首先遍历到尾部,然后从尾部进行到头值进行操作,后进先 ...

  10. 剑指Offer - 九度1521 - 二叉树的镜像

    剑指Offer - 九度1521 - 二叉树的镜像2013-11-30 23:32 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入 ...

随机推荐

  1. android内嵌入webview导致闪退

    这里碰到的是各种闪退情况之一,webview退出后,程序里立马需要申请内存空间做别的事情,这时内存不够就会闪退,做法就是延时个几百毫秒,在这段时间内让java把该回收的内存都回收,然后延时到了再做接下 ...

  2. Binary Tree Traversal

    1.Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' values. For ex ...

  3. ZOJ 1107 FatMouse and Cheese

    原题链接 题目大意:FM在一个街道n*n街道的(0,0)点,在每个网格里放着cheese,他要尽可能多的吃这些cheese.有两个规则:1)他跑的总距离不能超过k步:2)下一个节点的cheese的块数 ...

  4. JavaWeb学习记录(二十二)——模式字符串与占位符

    一.Java代码案例 @Test    public void test10(){        int planet=7;        String event="a disturban ...

  5. 机器翻译 2010年NOIP全国联赛提高组

    题目描述 Description 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换.对于每个英 ...

  6. PHP的一些要点

    1.用户评论的内容应当使用htmlspecialchars()函数进行过滤,如htmlspecialchars($_POST['content']);再写入数据库,防止用户评论中含有JS和HTML代码 ...

  7. 论文笔记之:Asynchronous Methods for Deep Reinforcement Learning

    Asynchronous Methods for Deep Reinforcement Learning ICML 2016 深度强化学习最近被人发现貌似不太稳定,有人提出很多改善的方法,这些方法有很 ...

  8. JSBinding + SharpKit / 安装SharpKit以及添加SharpKit工程

    本文说明如何往 sln 中添加 SharpKit 工程,以及配置. SharpKit 工程用于将 C# 源代码编译成 JS  代码. QQ群 189738580 1. 安装SharpKit 到 sha ...

  9. PHP实现动态规划背包问题

    有一堆货物,有各种大小和价值不等的多个物品,而你只有固定大小的背包,拿走哪些能保证你的背包带走的价值最多 动态规划就是可以记录前一次递归过程中计算出的最大值,在之后的递归期间使用,以免重复计算. &l ...

  10. ABBYY PDF Transformer+从文件选项中创建PDF文档的教程

    可使用OCR文字识别软件ABBYY PDF Transformer+从Microsoft Word.Microsoft Excel.Microsoft PowerPoint.HTML.RTF.Micr ...