Java中的数据结构

本文介绍了基本的数据结构如栈、队列、数组和链表的特点,以及二叉树特别是平衡二叉树(包括红黑树)的平衡维护和旋转机制。还详细讲解了TreeSet的存储结构和排序策略,包括自然排序和自定义比较器的使用。
摘要由CSDN通过智能技术生成

目录

1,栈:

2,队列:

3,数组:

4,链表:

5,二叉树:

平衡二叉树相关

红黑树相关


1,栈:

        后进先出,先进后出,类似单价一样

2,队列:

         先进先出,后进后出 ,类似窗口排队

3,数组:

        内存连续区域,查询块,增删慢(因为每一次增删都有可能大幅改变数组中元素的位置)

4,链表:

        元素是游离的,查询慢,首尾操作极快,增删相比数组快一点点点

5,二叉树:

  • 普通二叉树:乱序,查询性能比较低
  • 二叉查找树/二叉搜索树:有序,小的往左边存,大的往右边村,一样的不存
    • 平衡二叉树 : 在有序的情况下,尽可能的使左右两边高度相等提高搜索性能
    • 红黑树:红黑树不是高度平衡的,他的平衡是根据红黑规则进行实现的
平衡二叉树相关

平衡二叉树旋转机制: 左旋和右旋,是为了调节平衡二叉树的左右两边高度使左右两边高度相差不大于1

旋转时机:往树中添加了一条数据导致左右两边高度不平衡了,就会触发旋转操作

左旋步骤 从添加的节点开始,不断的往父节点找不平衡的节点,不平衡的判断标准左子树和右子树的高度差大于1

  • 以不平衡的点作为支点 
  • 将根节点的右侧往左拉
  • 原先的右子节点变成新的父节点,并把多余的左子节点让出给已降级的根节点当右子节点

右旋步骤 : 和左转一样,方向互换

平衡二叉树需要旋转的四种情况:

  • 左左:一次右旋
  • 左右:先局部左旋,然后整体右旋
  • 右右:一次左旋
  • 右左:先局部右旋,然后整体左旋

左左的意思:根节点左子树的左子树有节点插入导致不平衡

左右的意思:根节点左子树的右子树有节点插入导致不平衡

红黑树相关

TreeSet的存储结构就是红黑树,它的取出顺序:左中右

TreeSet排序 (自然排序) 步骤:

  1. 类实现Comparable接口
  2. 重写compareTo方法
  3. 根据方法的返回值,来组织排序规则
    1.  返回值负数:左边走
    2. 返回值正数:右边走
    3. 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排序 (比较器排序) 步骤:

  1. 在TreeSet的构造方法中,传入Compartor接口的实现类(匿名内部类即可)
  2. 重写compare方法
  3. 根据方法的放回值,来组织排序规则

        注意:比较器排序的优先级会高于类中重写的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);
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值