赞
踩
普通二叉树:
如果按照以上规则,把 7,10,11,12,13按照规则插入,如果数据量大的话,添加和查找的效率就会非常低。
往平衡二叉树中添加元素,是如果保证二叉树的平衡的呢?
这时我们就用到平衡二叉树的旋转规则了
左右:当根节点左子树的右子树有节点插入时,导致二叉树不平衡
如和旋转:现在左子树对应的节点位置进行左旋,再对整体进行右旋
右右:当根节点右子树的右子树有节点插入时,导致二叉树不平衡
如何旋转:直接对整体进行左旋
右左:当根节点的右子树的左子树右节点插入时,导致二叉树不平衡
如何旋转: 先在右子树对应的节点位置进行右旋,再对整体进行左旋
public class Student implements Comparable<Student>{ private String name; private int chinese; private int math; private int english; 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 + '}' + ",总分=" + getSum(); } 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; } }
测试类
public static void main(String[] args) { TreeSet<Student> p = new TreeSet<>(); Student s1 = new Student("王五", 86, 80, 90);//256 Student s2 = new Student("张三", 90, 86, 90);//266 Student s3 = new Student("赵六", 100, 100, 100);//300 p.add(s1); p.add(s2); p.add(s3); for (Student student : p) { System.out.println(student); } } 输出结果: Student{name='王五', chinese=86, math=80, english=90},总分=256 Student{name='张三', chinese=90, math=86, english=90},总分=266 Student{name='赵六', chinese=100, math=100, english=100},总分=300
修改compareTo中的方法:
@Override public int compareTo(Student o) { int result = o.getSum() - this.getSum(); // 次要条件 // 总分一样就比较语文成绩 result = result == 0 ? o.getChinese() - this.getChinese() : result; // 语文成绩一样就比较数学成绩 result = result == 0 ? o.getMath() - this.getMath() : result; // 数学成绩一样,就比较英语成绩(总分一样,语文数学都一样,英语自然就一样了,这一行可以不用写) result = result == 0 ? o.getenglish() - this.getenglish() : result; // 如果成绩都一样,就按照姓名进行排序 result = result == 0 ? o.getName().compareTo(this.getName()) : result; return result; } 调用上边的main方法:输出结果集(从大到小排序) Student{name='赵六', chinese=100, math=100, english=100},总分=300 Student{name='张三', chinese=90, math=86, english=90},总分=266 Student{name='王五', chinese=86, math=80, english=90},总分=256
使用两种不同的方式,最后生成的红黑树不同。但是在取出结果时,都是先获取左边,在获取中间,在获取右边。
所以最后取出的结果也会有差异!
public static void main(String[] args) { HashSet<String> hs = new HashSet(); hs.add("你好"); hs.add("世界!"); hs.add("java"); hs.add("java"); hs.add("java"); hs.add("Hello"); hs.add("Hello"); Iterator<String> iterator = hs.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } System.out.println("================="); for (String h : hs) { System.out.println(h); } }
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
创建一个默认长度为16, 默认加载因子为0.75的数组,数组名为table
HashSet<String> hm = new HashSet<>();
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (Double.compare(person.age, age) != 0) return false; return Objects.equals(name, person.name); } @Override public int hashCode() { int result; long temp; result = name != null ? name.hashCode() : 0; temp = Double.doubleToLongBits(age); result = 31 * result + (int) (temp ^ (temp >>> 32)); return result; }
主函数
public static void main(String[] args) { HashSet<Person> hs = new HashSet<>(); // 如果不重写equals与hashcode方法,因为每个对象的地址值不同,Object类中的哈希值的计算方法就是根据地址来的,所以这些的哈希值也不同,所以存储的位置各不相同,所以都会存入进去,不满足题目条件 // 重写hashCode方法,让他们计算的哈希值一样 // 重写equals方法,设置自己想要的比较规则 Person person1 = new Person("穆罕默德", 63); Person person2 = new Person("牛顿", 85); Person person3 = new Person("耶稣", 33); Person person4 = new Person("释迦牟尼", 81); Person person5 = new Person("释迦牟尼", 81); hs.add(person1); hs.add(person2); hs.add(person3); hs.add(person4); hs.add(person5); for (Person h : hs) { System.out.println(h); } }
感谢大家的阅读,如果文章中有不懂的地方,或者是有错误,就请评论或者私信我吧,感谢大家的支持!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。