描述 给定一个二叉树,返回该二叉树层序遍历的结果(从左到右,一层一层地遍历)
例如:给定的二叉树是{3,9,20,#,#,15,7},
ArrayDeque
ArrayDeque是java中对双端队列的线性实现
在这里插入代码片
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型ArrayList>
*/
public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
// write code here
ArrayList<ArrayList<Integer>> res=new ArrayList();
if(root==null){return res;}
Queue<TreeNode> q=new ArrayDeque<TreeNode>();
q.add(root);
while(!q.isEmpty()){
int n=q.size();
//补充定义一维数组
ArrayList<Integer> row=new ArrayList();
for(int i=0;i<n;i++){
TreeNode cur=q.poll();
row.add(cur.val);
if(cur.left!=null){
q.add(cur.left);
}
if(cur.right!=null){
q.add(cur.right);
}
}res.add(row);
}
return res;
}
}
head first java 读书笔记
友好的语法、可移植性、面向对象、内存管理
java:友好的语法
友好的语法
java语法友好
为什么说java语法友好
为什么说java语法友好
Java很容易学习,因为它消除了无用和复杂的特性,如运算符重载、显式指针等。此外,Java有一个类似于C++的语法,而且相对容易,特别是对于有C。它的创建是为了产生一种易于学习、使用、编译和调试的语言,因此Java比其他编程语言简单得多。
面向对象
创建类的对象就是创建类的示例。Java是面向对象的,也就是说,它创建每个类的实例,这些实例是类的副本。创建对象的优点是有几个相同代码的例子,并且在不修改主代码的情况下对对象进行修改。
JDK是支持Java程序开发的最小环境。Java虚拟机,Java类库和Java编程语言,统称为JDK。
JRE是支持Java程序运行的标准环境。Java虚拟机,Java类库API中的Java SE API子集,统称为JRE。
我们知道,Java是跨平台语言,“一次编写,到处运行”。
————————————————
版权声明:本文为CSDN博主「richest_qi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qzw752890913/article/details/120722404
运行时数据区域Java程序运行时的内存管理由Java虚拟机负责。 Java虚拟机所管理的内存主要包括以下几个运行时数据区域
栈(虚拟机栈)
Java虚拟机执行java方法时,使用的是虚拟机栈。
每个方法执行时,Java虚拟机都会同步创建一个栈帧。
栈帧中存储着局部变量表、操作数栈、动态连接、方法出口等信息。
其中,局部变量表中存放着各种Java基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用。
————————————————
版权声明:本文为CSDN博主「richest_qi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qzw752890913/article/details/120722404堆 堆中存放着对象实例。用new创建一个对象,这个对象存储在堆里。 方法区
方法区中存放着已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
运行时常量池是方法区的一部分,存放着编译期生成的各种字面量与符号引用。
直接内存直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。
直接内存是在Java堆外的,直接向系统申请的内存空间。
总结:内存管理由java虚拟机负责,Java虚拟机执行Java方法时,执行的是虚拟机栈。new的对象存在堆里。
最棒的跨平台移植性
即源代码。java文件已经被编译并转换成字节码,字节码可以在任何有Java虚拟机的机器上运行,Java虚拟机将字节码转换成计算机硬件可运行。
其他大多数编程语言如COBOL、C++、Smalltalk或Visual Basic将大部分代码编译成二进制文件。二进制文件依赖于平台,也就是说,为基于Intel的Windows机器设计的程序不能在基于Linux的机器或MAC上运行。
总结:Java可移植性:基于Java虚拟机,Java编成字节码,只要有虚拟机,就可以运行
write-once/run-anywhere
添加链接描述
编写一次,到处运行,直观的描述了Java具有强的跨平台能力,Java的跨平台特性与Java虚拟机的存在密不可分,在不同的平台都有相应的JDK,安装好JDK就能给Java提供相应的运行环境,Write once, run anywhere体现在不同的平台都可提供Java运行的环境。
————————————————
版权声明:本文为CSDN博主「Aminokk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37537818/article/details/105392501
源代码->编译器->(打代码)、->输出
编译器会产出字节码,任何支持Java的装置都会把他转成可执行的内容
->虚拟机
通过软件实现,可以读取与执行字节码
源代码->编译器
执行javac程序编译.java文件,如果没错,会产生.class文件,这个文件由字节码组成
->输出
编译成代码.class
->java虚拟机
启动JVM(java虚拟机)运行.class文件,将字节码转换为平台理解的方式来运行
Java1.02 Java1.1 Java2 Java5.0
int size = 27;//定义size=27
String name = “Fido”;//定义name string类型 =Fido
Dog myDog = new Dog(name, size);//Dog类实例化一个对象 myDog,有两个属性:name,size
x = size - 5;//定义x=size-5 :22
if (x < 15) myDog.bark(8);//如果 x<15 mydog 调用方法bark 传参8
while (x > 3) {//当 x>3的时候
myDog.play();//mydog 使用play 方法
}
int[] numList = {2,4,6,8}; //定义数组numList:2468
System.out.print(“Hello”);//打印 :Hello
System.out.print(“Dog: “ + name);//打印:Dog类的姓名
String num = “8”;//定义num string类型 =8
int z = Integer.parseInt(num);//定义z等于
try {
readTheFile(“myFile.txt”);
}//这个应该是读 .txt
catch(FileNotFoundException ex) {
System.out.print(“File not found.”);//如果失败了 打印 file not found
}
```java
```java
int size = 27;//声明一个int 类型,名称为size的对象并赋初始值27
String name = “Fido”;//声明名称为 的字符串
Dog myDog = new Dog(name, size);//以name和size 声明一个名称为为myDog 的Dog变量
x = size - 5;
if (x < 15) myDog.bark(8);
while (x > 3) {
myDog.play();
}
int[] numList = {2,4,6,8};//声明有四个元素的整型数组
System.out.print(“Hello”);
System.out.print(“Dog: “ + name);//把dog输出到屏幕上,并输出它的名字
String num = “8”;
int z = Integer.parseInt(num);//将字符串8 转换为整型数字8
try {
readTheFile(“myFile.txt”);
}
catch(FileNotFoundException ex) {
System.out.print(“File not found.”);
}
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
temp.offer
出队
队列出队
队列入队
offer入队ok
队列定义new LinkedList
添加链接描述
java中LinkedList 集合类实现栈和队列
java集合二之LinkedList
LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
LinkedList也和ArrayList一样实现了List接口,但是它执行插入和删除操作时比ArrayList更加高效,因为它是基于链表的。基于链表也决定了它在随机访问方面要比ArrayList逊色一点。
if(flag)
c
如果 flag = 1,那么 if(flag){函数体} 里面的函数体会执行,如果flag = 0 那么大括号里面的函数体就不会执行了
你设置的flag=false,在判断语句中一经判断不是真,就直接执行if(!flag){…code…},因为“如果为假”满足已设置的Boolean flag=false;的要求。
语句,只有在if()中的boolean为true时,才能执行if()语句下面的{},
如果为false时,执行else下面{};
这样能理解
ArrayList row
在这里插入代码片
import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
TreeNode head=pRoot;
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
if(head==null){return res;}
Queue<TreeNode> temp=new LinkedList<TreeNode();
temp.offer(head);
TreeNode p;
boolean flag=true;
while(!temp.isEmpty()){
int n=temp.size();
ArrayList<Integer> row=new ArrayList<Integer>();
flag=!flag;
for(int i=0;i<n;i++){
p=temp.poll();
row.add(p.val);
if(p.left!=null)
{temp.offer(p.left);
}
if(p.right!=null){
temp.offer(p.right);
}
}if(flag){
Collections.reverse(row);
res.add(row);
}
}
return res;
}