目录
1,栈:
后进先出,先进后出,类似单价一样
2,队列:
先进先出,后进后出 ,类似窗口排队
3,数组:
内存连续区域,查询块,增删慢(因为每一次增删都有可能大幅改变数组中元素的位置)
4,链表:
元素是游离的,查询慢,首尾操作极快,增删相比数组快一点点点
5,二叉树:
- 普通二叉树:乱序,查询性能比较低
- 二叉查找树/二叉搜索树:有序,小的往左边存,大的往右边村,一样的不存
- 平衡二叉树 : 在有序的情况下,尽可能的使左右两边高度相等提高搜索性能
- 红黑树:红黑树不是高度平衡的,他的平衡是根据红黑规则进行实现的
平衡二叉树相关
平衡二叉树旋转机制: 左旋和右旋,是为了调节平衡二叉树的左右两边高度使左右两边高度相差不大于1
旋转时机:往树中添加了一条数据导致左右两边高度不平衡了,就会触发旋转操作
左旋步骤 从添加的节点开始,不断的往父节点找不平衡的节点,不平衡的判断标准左子树和右子树的高度差大于1
- 以不平衡的点作为支点
- 将根节点的右侧往左拉
- 原先的右子节点变成新的父节点,并把多余的左子节点让出给已降级的根节点当右子节点
右旋步骤 : 和左转一样,方向互换
平衡二叉树需要旋转的四种情况:
- 左左:一次右旋
- 左右:先局部左旋,然后整体右旋
- 右右:一次左旋
- 右左:先局部右旋,然后整体左旋
左左的意思:根节点左子树的左子树有节点插入导致不平衡
左右的意思:根节点左子树的右子树有节点插入导致不平衡
红黑树相关
TreeSet的存储结构就是红黑树,它的取出顺序:左中右
TreeSet排序 (自然排序) 步骤:
- 类实现Comparable接口
- 重写compareTo方法
- 根据方法的返回值,来组织排序规则
- 返回值负数:左边走
- 返回值正数:右边走
- 0:不存
//重写一个学生类继承Comparable接口,重写compareTo方法
//要求:根据年龄主要排序,再根据姓名次要排序,如果年龄姓名都一致的情况下不能不存,给他个1或-1的值都可以;
@Override
public int compareTo(CompareStudentDemo o) {
//根据年龄来设置排序
int ageResult = this.age - o.age;
//如果年龄相同的情况下,就根据姓名进行排序,姓名是字符串,String类中也提供了compareTo()的方法来判断大小
int nameResult = ageResult == 0 ? this.name.compareTo(o.name) : ageResult ;
//如果年龄相同,姓名也相同,那么就让他往右边排,不要不存;
int Result = nameResult == 0 ? 1 : nameResult;
return Result;
}
TreeSet排序 (比较器排序) 步骤:
- 在TreeSet的构造方法中,传入Compartor接口的实现类(匿名内部类即可)
- 重写compare方法
- 根据方法的放回值,来组织排序规则
注意:比较器排序的优先级会高于类中重写的compareTo方法,因此,如果不想使用java中提供的compareTo方法的话,可以使用比较器的方法来覆盖java类中的compareTo方法。比如如果不想用String类中自带的compareTo方法的话,那么就使用比较器排序来覆盖compareTo方法。
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//如果使用String自己提供的compareTo方法的话,王五两个没办法都存进去,
//所以,要想都存的话,就使用比较器的方法来覆盖String自己的方法,因为比较器的优先级比类中CompareTo的高
return o1.compareTo(o2) == 0 ? 1 : o1.compareTo(o2) ;
}
});
treeSet.add("王五");
treeSet.add("王五");
treeSet.add("赵四");
treeSet.add("张三");
System.out.println(treeSet);
}