tnblog
首页
视频
资源
登录

红黑树-练习 09

2638人阅读 2022/6/16 19:56 总访问:1083024 评论:0 收藏:0 手机
分类: Java集合


1、学生类的代码如下

public class Student implements Comparable<Student> {
    private String name;
    private int chinese;
    private int math;
    private int english;

    public Student() {
    }

    public Student(String name, int chinese, int math, int english) {
        this.name = name;
        this.chinese = chinese;
        this.math = math;
        this.english = english;
    }

    public String getName() {
        return name;
    }

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

    public int getChinese() {
        return chinese;
    }

    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    public int getMath() {
        return math;
    }

    public void setMath(int math) {
        this.math = math;
    }

    public int getEnglish() {
        return english;
    }

    public void setEnglish(int english) {
        this.english = english;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", chinese=" + chinese +
                ", math=" + math +
                ", english=" + english +
                '}';
    }

    public int getSum() {
        return chinese + math + english;
    }

    @Override
    public int compareTo(Student o) {
        //按总分就行排序
        int result = this.getSum() - o.getSum();
        //次要条件
        //如果总分成绩再相同,按语文成绩排序
        result = result == 0 ? this.getChinese() - o.getChinese() : result;
        //如果语文成绩再相同,按数学成绩排序
        result = result == 0 ? this.getMath() - o.getMath() : result;
        //如果数学成绩再相同,按英语成绩排序
        result = result == 0 ? this.getEnglish() - o.getEnglish() : result;
        //如果英语成绩再相同,根据姓名排序
        result = result == 0 ? this.getName().compareTo(o.getName()): result;
        return result;
    }
}

2-5、步骤代码如下

public class MyCollection6 {
    public static void main(String[] args) {
        TreeSet<Student> st = new TreeSet<>();

        Student s1 = new Student("dahei", 80, 80, 80);
        Student s2 = new Student("erhei", 90, 90, 90);
        Student s3 = new Student("xiaohei", 100, 100, 100);

        st.add(s1);
        st.add(s2);
        st.add(s3);
        for (Student t : st) {
            System.out.println(t);
        }

    }
}


在此次set的底层原理
它在底层会把这三个对象封装成三个节点,如下图形式

1、在添加节点240时,它会破会红黑规则,原因:根节点必须是黑色。所以要把节点240变为黑色,样式如下图

2、添加节点270的结果如下图

3、添加节点300后,它破坏红黑规则。原因:不能出现两个红色节点相连

解决过程如下

解决依据

其父节点为红色,叔叔节点是黑色

1.将“父节点270”设为“黑色”
2.  将“祖父节点240”设为“红色”
3.以祖父节点为支点进行旋转(是左旋还是右旋要看左右俩边的大小,即左右俩边层数的比较)

结果如下图




评价
没有个性,不需要签名
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
欢迎加群交流技术