集合--TreeSet,TreeMap,树

题目描述

给你两个集合,要求{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树的原因)


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值