作业1:已知二叉树的
前序遍历:ABCDEFGHK
中序遍历:BDCAEHGKF
根据已有条件,画出这个二叉树,同时输出该二叉树的后序遍历
分析:
前序遍历顺序:根左右
中序遍历顺序:左根右
根据前序遍历读出根,再根据中序遍历读出左右孩子,再根据前序遍历读出左/右根,如此交替判断。
前序遍历:ABCDEFGHK 知A为树的根
中序遍历:BDCAEHGKF 知BDC为A的左孩子,EHGKF为A的右孩子
前序遍历:ABCDEFGHK 知B为左子树根,E为右子树根
中序遍历:BDCAEHGKF 知DC为B的右孩子,HGKF为E的右孩子
前序遍历:ABCDEFGHK 知C为左子树根,F为右子树根
中序遍历:BDCAEHGKF 知D为C的左孩子,左子树完毕。HGK为F的左孩子
前序遍历:ABCDEFGHK 知G为根
中序遍历:BDCAEHGKF 知H为G的左孩子,K为G的右孩子,右子树完毕。
作业2:课堂案例,面向对象编程
1).求正方形、矩形、三角形周长和面积。
package com.openlab.demo;
public class Demo02 {
public static void main(String[] args) {
Square s = new Square();
s.side = 4;
System.out.println("正方形的周长是:" + s.circumfer());
System.out.println("正方形的面积是:" + s.area());
Rectangle r = new Rectangle();
r.length = 4;
r.width = 5;
System.out.println("矩形的周长是:" + r.circumfer());
System.out.println("矩形的面积是:" + r.area());
Triangle t = new Triangle();
t.a = 3;
t.b = 4;
t.c = 5;
System.out.println("三角形的周长是:" + t.circumfer());
System.out.println("三角形的面积是:" + t.area());
}
}
//正方形
class Square{
double side;//边长
public double circumfer() {//周长
return 4 * side;
}
public double area() {//面积
return Math.pow(side, 2);
}
}
//矩形
class Rectangle{
double length;//长
double width;//宽
public double circumfer() {//周长
return 2 * (length + width);
}
public double area() {//面积
return length * width;
}
}
//三角形
class Triangle{
double a;//第一条边
double b;//第二条边
double c;//第三条边
public double circumfer() {//周长
return a + b + c;
}
public double area() {//面积,用海伦公式,因为不知道是什么三角形
double p = circumfer() / 2.0;//周长的一半
return Math.pow(p * (p - a) * (p - b) * (p - c), 0.5);
}
}
2)有只猫,有很多属性
名字
性别
年龄
花色
主人
主人类,也有很多属性
姓名
性别
年龄
地址
有猫
package com.openlab.demo;
public class Demo03 {
public static void main(String[] args) {
Master m = new Master();
m.name = "王勇";
m.age = 13;
m.address = "陕西";
m.gender = "男";
Cat c1 = new Cat();
c1.name = "小花";
c1.age = 3;
c1.color = "花色";
c1.gender = '公';
c1.master = m;
//System.out.println(c1.master.name);
//System.out.println(c1.master.age);
Cat c2 = new Cat();
c2.name = "小黑";
c2.age = 2;
c2.color = "黑色";
c2.gender = '母';
c2.master = m;
//从主人这个方向关联两只猫
Cat[] cats = {c1, c2};
m.cat = cats;
}
}
class Cat{
public String name;//名字
public char gender;//性别,也可以是数字,boolean,String
public byte age;//年龄,也可以用int
public String color;//花色
public Master master ;//有个主人对象,属性可以是对象
}
class Master{
public String name;//名字
public int age;//年龄
public String gender;//性别
public String address;
public Cat[] cat;//主人有猫
}
作业3:
给定一个数字,求该数字的二进制的1的个数
方法三,位运算方法:
1)num - 1:将一个数减1,就是将这个数的二进制的最右边的1变成0,(0-1不起作用,若有0会向前借位,让1-1,此时这个二进制位就会变成0)然后它后边的所有位置都变成1(借位)
2)num & (num - 1):这个操作会让最右边的1开始全变成0
如此循环,露1,去1,楼1,去1,累加1即可。0011 0100 - 1 = 0011 0011
0011 0100 - 1 = 0011 0011
0011 0100 & 0011 0011 = 0011 0000 // 计数一个1
0011 0000 - 1 = 0010 1111
0011 0000 & 0010 1111 = 0010 0000 // 计数两个1
0010 0000 - 1 = 0001 1111
0010 0000 & 0001 1111 = 0000 0000 // 计数三个1,程序停止
package com.openlab.day10;
//给定一个数字,求该数字的二进制的1的个数
public class Work01 {
public static void main(String[] args) {
int num = 456;
System.out.println(digit1(num));
System.out.println(digit2(num));
}
//方法一:常规方法,转成二进制数,记录1的个数
public static int digit1(int num) {
int count = 0;//记录1的个数
while(num != 0) {
if(num % 2 == 1) {
count++;
}
num = num >> 1;//相当于 num = num / 2
}
return count;
}
//方法二:位运算,与运算
public static int digit2(int num) {
int count = 0;//记录1的个数
while(num != 0) {
count++;
num = num & (num - 1);
}
return count;
}
}
作业4: 给定一个数组,该数组中除了一个元素只出现了一次,其他元素都出现两次
找到这个没有重复的元素
package com.openlab.day10;
public class Work02 {
public static void main(String[] args) {
int[] arr = {5, 8, 9, 6, 7, 1, 8, 9, 6, 7, 5, 1, 2};
System.out.println("这个没有重复的数为:" + findNoRepeat(arr));
}
//0 ^ 一个数 = 一个数 相同的数异或为0
//重复两次的数异或都为0,剩下一个不重复的数,次数和0做异或,结果还等于这个数
public static int findNoRepeat(int[] arr) {
int result = 0;
for(int i = 0; i < arr.length; i++) {
result = result ^ arr[i] ;
}
return result;
}
}
作业5:
给定一个数组,数组的元素共N+1个, 元素是从1到n的联系自然数,其中一个重复值
找到这个重复的元素
package com.openlab.day10;
public class Work03 {
public static void main(String[] args) {
int[] arr = new int[] {2, 4, 5, 1, 7, 9, 5, 6, 3, 8};//1到9,共10
System.out.println("重复的元素是:" + findRepeat(arr));
}
//一个数 ^ 一个数 = 0 数是从1到n,刚好可以利用下标进行异或,
//留下的那个数就是不重复的
//0异或一个数是0,不影响最后的结果,下标是从0开始的,所以i = 0
public static int findRepeat(int[] arr) {
int result = 0;
for(int i = 0; i < arr.length; i++) {
result = i ^ arr[i];
}
return result;
}
}