红黑树简

package J_TreeSet;

import java.util.Objects;

public class B_Student implements Comparable<B_Student>{
    private String name;
    private int age;

    public B_Student() {
    }

    public B_Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "A_Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }


    @Override
    ///this:表示当前要添加的元素
    ///o:表示已经在红黑树存在的元素  会依次比对
    public int compareTo(B_Student o) {
        //指定排序的规则
        //只看年龄,我想要按照年龄的升序进行排列
        System.out.println("--------------------");
        System.out.println("this:"+this);
        System.out.println("o:"+o);
        return this.getAge()-o.getAge();
        /// 返回值
        /// 正数:表示当前要添加的元素是大的,存右边
        /// 负数:表示当前要添加的元素是小的,存左边
    }
}
package J_TreeSet;

import java.util.TreeSet;

public class B_Test {
    public static void main(String[] args) {
/*
        需求:创建TreeSet集合,并添加3个学生对象
        学生对象属性:
        姓名,年龄。
        要求按照学生的年龄进行排序
        同年龄按照姓名字母排列(暂不考虑中文)
        同姓名,同年龄认为是同一个人

        方式一:
        默认的排序规则/自然排序
        让JavaBean实现一个接口parable接口,重写里面的抽象方法再指定规则
 */
        //1.创建三个学生对象
        B_Student s1 = new B_Student("zhangsan",23);
        B_Student s2 = new B_Student("lisi",24);
        B_Student s3 = new B_Student("wangwu",25);
        B_Student s4 = new B_Student("zhaoliu",26);

        //2.创建集合对象
        TreeSet<B_Student> ts = new TreeSet<>();
        ///此时我们创建的是treeSet的对象,底层是红黑树!
        /// 需要重写HashCode与equals方法的是哈希表相关的
        /// 使用红黑树需要在JavaBean指定排序规则



        //3.添加元素
        ts.add(s3);
        ts.add(s2);
        ts.add(s1);//s1添加后红黑树不平衡,自动旋转转换根节点


        //4.打印集合
        //System.out.println(ts);

        /*
        --------------------
        this:A_Student{name='wangwu', age=25}
        o:A_Student{name='wangwu', age=25}
        --------------------
        this:A_Student{name='lisi', age=24}
        o:A_Student{name='wangwu', age=25}
        --------------------
        this:A_Student{name='zhangsan', age=23}
        o:A_Student{name='wangwu', age=25}
        --------------------
        this:A_Student{name='zhangsan', age=23}
        o:A_Student{name='lisi', age=24}      二次调用compareTo方法
         */


        ts.add(s4);//添加这个开始 出现一下情况
        /*
        --------------------
        this:A_Student{name='wangwu', age=25}
        o:A_Student{name='wangwu', age=25}
        --------------------
        this:A_Student{name='lisi', age=24}
        o:A_Student{name='wangwu', age=25}
        --------------------
        this:A_Student{name='zhangsan', age=23}
        o:A_Student{name='wangwu', age=25}
        --------------------
        this:A_Student{name='zhangsan', age=23}
        o:A_Student{name='lisi', age=24}
        --------------------*////<----   从这里开始树旋转自动调整
       /* this:A_Student{name='zhaoliu', age=26}
        o:A_Student{name='lisi', age=24}*//// <------   这里的根节点就不是name='wangwu', age=25了
       /* --------------------
        this:A_Student{name='zhaoliu', age=26}
        o:A_Student{name='wangwu', age=25}*/




    }
}

 

posted @ 2025-11-07 12:25  赖皮真  阅读(1)  评论(0)    收藏  举报