题目描述
给你两个集合,要求{A} + {B}。 注:同一个集合中不会有两个相同的元素。
输入描述:
每组输入数据分为三行,第一行有两个数字n,m(0 ≤ n,m ≤ 10000),分别表示集合A和集合B的元素个数。后两行分别表示集合A和集合B。每个元素为不超过int范围的整数,每个元素之间有个空格隔开。
输出描述:
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开,行末无空格。
示例1
输入
复制
3 3
1 3 5
2 4 6
输出
复制
1 2 3 4 5 6
package xidian.lili.Demo01;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;
public class Demo04 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int n=sc.nextInt();
TreeSet<Integer> set=new TreeSet();
for(int i=0;i<m;i++){
set.add(sc.nextInt());
}
for(int i=0;i<n;i++){
set.add(sc.nextInt());
}
Iterator it=set.iterator();
while(it.hasNext()){
System.out.print(it.next());
if(it.hasNext()){
System.out.print(" ");
}
}
}
}
TreeSet是set的子类,用于元素的排序,且不允许重复数据
底层是大部分直接使用TreeMap的方法来实现的,它的构造方法如下,直接调用TreeMap的方法,TreeMap实现了接口NavigableMap,NavigableMap接口又实现了SortedMap,所以支持排序。
public TreeSet() {
this(new TreeMap<E,Object>());
}
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
在TreeSet的元素相当于TreeMap元素里的key,把所有元素都放在NavigableMap中,
比如TreeSet的put方法,相当于把元素e当做key放入NavigableMap对象中
TreeMap
treemap是基于红黑树的数据结构,底层是用根节点的Entry对象来实现的,而HashMap是一个Entry<V,K> [] table数组实现的
红黑树
一个红黑树有五个要求:
1. 树中每个节点必须是有颜色的,要么红色,要么黑色;
2. 树中的根节点必须是黑色的;
3. 树中的叶节点必须是黑色的,也就是树尾的NIL节点或者为null的节点;
4. 树中任意一个节点如果是红色的,那么它的两个子节点一点是黑色的;
5. 任意节点到叶节点(树最下面一个节点)的每一条路径所包含的黑色节点数目一定相同;
所以当向TreeMap中插入一个节点,要保证不能破坏红黑树的结构,比较复杂,需要进行渲染,旋转等来调整使得插入后的树仍然是一棵二叉树。
节点插入过程
https://www.jianshu.com/p/2dcff3634326
红黑树,平衡二叉树,B树
二叉查找树利用二分查找大大提高查找速度,但是跟树的深度有很大的关系,所以引出平衡二叉树,要求树的左子树和右子树的高度差只能是1,0,-1.通过在向树结构的数据新增/删除时的旋转(左旋和右旋)来维持平衡二叉树的结构。
红黑树是一种自平衡二叉查找树
B树是一种自平衡的树,是多路查找树,没有限制一个节点的出度只能小于等于2,那么B树的深度一般就会小于红黑树(索引采用B树的原因)