目录
1. 已知二叉树的前序遍历:ABCDEFGHK,中序遍历:BDCAEHGKF。根据已有条件,画出这个二叉树,同时输出该二叉树的后序遍历
2. 有只猫,有很多属性:名字、性别、年龄、花色、主人;主人类,也有很多属性:姓名、性别、年龄、地址、有猫
3. 给定一个数字,求该数字的二进制的1的个数
4. 给定一个数组,该数组中除了一个元素只出现了一次,其他元素都出现两次,找到这个没有重复的元素
5. 给定一个数组,数组的元素共N+1个, 元素是从1到n的连续自然数,其中一个重复值,找到这个重复的元素
1. 已知二叉树的前序遍历:ABCDEFGHK,中序遍历:BDCAEHGKF。根据已有条件,画出这个二叉树,同时输出该二叉树的后序遍历
解:1. 由前序遍历:ABCDEFGHK 可知,A是根节点;
2. 由中序遍历:BDCAEHGKF,我们得到BCD是在A的左侧分支上,结合前序,B应为A左分支的根节点,且B没有左节点,因为如果B有左分支的话,中序B应该靠后,而不是第一个;
3. 根据2我们得到CD都在B的右分支,前序C在前D在后,我们得到C是B的右分支的根节点,D是C的子结点,而中序D在前C在后,我们得到D是C的左分支;
根据以上分析我们得出了左分支,如下图:
我们验证一下:前序:ABCD,中序:BDCA,与题目一致,我们继续推右分支
4. 我们发现前序:ABCD E,中序:BDCA E,因为E在右分支上,E中序和前序一样,说明E没有左分支,作为A右分支的根节点,HGKF在E右分支
5. 由前序得出F为E右分支上的根节点,HGK都在F的左分支上,中序F子HGK后
6. G为F的左分支上的根节点,前序:GHK,中序HGK,前序(根左右)、中序(左根右),我们很容易发现H是F左分支,K是F右分支。
根据以上分析我们得出了右分支,如下图:
我们验证一下:前序:ABCDEFGHK,中序:BDCAEHGKF,与题目一致
后序遍历:DCBHKGFEA
2. 有只猫,有很多属性:名字、性别、年龄、花色、主人;主人类,也有很多属性:姓名、性别、年龄、地址、有猫
import java.util.Arrays;
public class CatTest {
public static void main(String[] args) {
Master zjh = new Master();
zjh.name = "小张";
zjh.age = 19;
zjh.address = "四川";
zjh.gender = "男";
Cat c1 = new Cat();
c1.name = "小花";
c1.color = "花色";
c1.gender = "公";
c1.age = 3;
// 找到了主人
c1.master = zjh;
// System.out.println(c1.master.name);
// System.out.println(c1.master.age);
Cat c2 = new Cat();
c2.name = "小黑";
c2.color = "黑色";
c2.gender = "母";
c2.age = 2;
// 找到了主人
c2.master = zjh;
// 从主人这个方向关联两只喵
Cat[] cats = {c1, c2};
zjh.cats = cats;
System.out.println(Arrays.toString(zjh.cats));
// 两个猫对象:[com.openlab.day10.exer.Cat@15db9742, com.openlab.day10.exer.Cat@6d06d69c]
}
}
class Cat {
public String name;
public String gender;
public int age;
public String color;
// 有个主人对象
public Master master;
}
class Master {
public String name;
public int age;
public String gender;
public String address;
public Cat[] cats;
}
3. 给定一个数字,求该数字的二进制的1的个数
import java.util.Scanner;
public class FindBinaryOne {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = scanner.nextInt();
scanner.close();
findBinaryOne(num);
}
private static void findBinaryOne(int num) {
// TODO Auto-generated method stub
/*
* 10
* 5 0
* 2 1
* 1 0 ==> 1010
* 7
* 3 1
* 1 1 ==> 111
*/
String binary = "";
while (num / 2 > 0) {
binary = (num % 2) + binary;
num /= 2;
}
binary = num + binary;
System.out.println(binary);
int count = 0;
for (int i = 0; i < binary.length(); i++) {
if (binary.charAt(i) == '1') {
count++;
}
}
System.out.println(count);
}
}
结果:
4. 给定一个数组,该数组中除了一个元素只出现了一次,其他元素都出现两次,找到这个没有重复的元素
/*
* 给定一个数组,该数组中除了一个元素只出现了一次,
* 其他元素都出现两次,找到这个没有重复的元素
*/
public class FindNotRepeat {
public static void main(String[] args) {
int[] arr = { 1, 5, 3 ,5 ,3, 6, 1};
findNotRepeat(arr);
}
private static void findNotRepeat(int[] arr) {
// 找到没有重复的元素
int temp = 0;
for (int i = 0; i < arr.length; i++) {
temp = temp ^ arr[i];
// 1 ^ 5 ^ 3 ^ 5 ^ 3 ^ 6 ^ 1 = 6
}
System.out.println(temp); // 6
}
}
结果:
5. 给定一个数组,数组的元素共N+1个, 元素是从1到n的连续自然数,其中一个重复值,找到这个重复的元素
可使用暴力破解,二分查找,异或,Set等方法
import java.util.HashSet;
import java.util.Set;
/*
* 给定一个数组,数组的元素共N+1个, 元素是从1到n的连续自然数,
* 其中一个重复值,找到这个重复的元素
*/
public class FindRepeat {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 4, 5, 6};
findRepeat(arr);
findRepeat1(arr);
findRepeat2(arr);
}
public static void findRepeat2(int[] arr) {
// 找到这个重复的元素:暴力破解
for (int i = 0; i < arr.length; i++) {
boolean isFlag = true;
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
isFlag = false;
}
}
if (isFlag == false) {
System.out.println(arr[i]);
}
}
}
public static void findRepeat1(int[] arr) {
// 找到这个重复的元素:异或法
int temp = 0;
for (int i = 0; i < arr.length; i++) {
temp = i ^ arr[i];
// 0 ^ 1 1 ^ 2 2 ^ 2
if (temp == 0) {
System.out.println(arr[i]);
break;
}
}
}
public static void findRepeat(int[] arr) {
// 找到这个重复的元素:HashSet
Set set = new HashSet<>();
for (int i = 0; i < arr.length; i++) {
if (set.add(arr[i]) == false) {
System.out.println(arr[i]);
}
}
}
}
结果: