Java编程练习题:二叉树的遍历、Cat类和Master类、给定数字求二进制1个数,求数组中的没有的重复元素,求数组中的重复元素

目录

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]);
			}
		}
	}
}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Golang_HZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值