红黑树(二叉树)

红黑树的概念

可以称之为二叉树,比根节点大的往又分叉,比根节点小的往左分叉,以此类推,可能会出现失去平衡的这种情况,那么就出现了我们的平衡二叉树
平衡二叉树:为了让二叉树平衡,就有了左旋和右旋,无论是左旋还是右旋,还是之前的那颗二叉树
二叉树的特点:就是大的在右,小的在左,会出现不平衡的情况,会有左旋和右旋
TreeSet底层是TreeMap,TreeMap底层是红黑树
TreeSet:自动默认自然排序,就是(12345,abcdefg等),限制为数字和英文的字符排序
引用数据类型排序会出现类型转换问题错误,要实现一个Comparable的接口,重写里面的一个comparaTo的方法,在里面写一个自定义的比较方式,接下来,我们来看一下代码

public static void method() {
		Set set=new TreeSet();
		set.add(23);
		set.add(65);
		set.add(17);
		set.add(99);
		System.out.println(set);
		
		Set set2=new TreeSet();
		set2.add("abc");
		set2.add("bcd");
		set2.add("cba");
		set2.add("cab");
		System.out.println(set2);
		
		
	}

这个是我们的字母和数字用TreeSet的一个添加,那么对于默认的数字和字母的话,是友一个默认排序法的,这个默认排序法可以称为自然排序法,就是对我们的字母和数字,进行一个1234556789、abcdefg的这种默认排序

/*
	 * 引用数据类型排序
	 */
	
	public static void objMethod() {
		Set set=new TreeSet();
		set.add(new User(17,"小张"));
		set.add(new User(18,"小赵"));
		set.add(new User(19,"小黄"));
		set.add(new User(17,"小黄"));
		System.out.println(set);
	}

引用数据类型排序呢,是先按照这个数字的前后顺序先排
要想在引用数据类型在Set里面存储内容的话,第一种方案就是用把实体类本身实现Comparable自定义规则
第二种方案就是在外部定义一个类实现Comparator接口,重写Compera
推荐用第二种方案,因为类本身是用来描述的,比较是额外添加的功能,应该单独写一个类里面

我们来看一下自定义比较器


```java
public static void customObjMethod() {
		Set set=new TreeSet(new ComPareByPriceAndBrand());
		set.add(new Item(6.6,"大刀肉","良品铺子"));
		set.add(new Item(79.8,"坚果礼盒","baidu"));
		set.add(new Item(1900,"ipad mini","apple"));
		set.add(new Item(79.9,"坚果礼盒","alibaba"));
		System.out.println(set);
当然这是我们new的一个对象,我们调用对象的有参构造器,在里面直接传参数,那么我们在创建红黑树的时候TreeSet(new ComPareByPriceAndBrand());,在里面直接new的这个对象,是我们在另外一个类里面写的比较器,可以直接在TreeSet里面
调用

```java
@Override
	public int compare(Object o1, Object o2) {
		Item item=(Item)o1;
		Item item2=(Item)o2;
		//先比较价格
		double temp=item.getPrice() - item2.getPrice();
//		double temp =
		//判断价格是否相等,如果相等就根据商家名字进行排序
		if(temp<0) {
			return (int)Math.floor(temp);
		}
		else if(temp==0) {
			return item.getBrand().compareTo(item2.getBrand());
		}else {
			return (int)Math.ceil(temp);
		}
		

而我们要先实现一个接口,只有实现了这个接口,我们才能自定义一个比较器,而我们实现的接口是这个implements Comparator
然后冲写了里面的compare方法,当然这是我们比较器的第二方法,里面先比较价格,如果价格相等,再比较商家名称,按商家名
称进行排序,如果商品价格不一样的话,那就不用再往下比较了,可以直接排序,我比较推荐大家使用第二种方法来写比较器

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值