二叉树的存值
当添加新节点时,总是从树的根节点开始比较,即将根节点当成当前节点,如果新增节点大于当前节点且当前节点的右节点存在,则以右节点作为当前节点;如果新增节点小于当前节点且当前节点的左节点存在,则以左节点作为当前节点;如果新增节点等于当前节点,则新增节点覆盖当前节点
遍历
前序遍历
先访问根结点,然后前序遍历左子树,再前序遍历右子树
根结点 -> 左子树 -> 右子树
结果:20、10、6、15、50、30、78、90
中序遍历
从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树
左子树 -> 根结点 -> 右子树
结果:6、10、15、20、30、50、78、90
后序遍历
从左到右先子叶后结点的方式遍历访问左右子树,最后是访问根节点
从左到右访问叶子结点 -> 根结点
结果:6、15、10、30、90、78、50、20
层次遍历
从树的第一层,也就是根节点开始访问。从上而下逐层遍历。在同一层中,按从左到右的顺序对结点逐个访问
第一层 -> 第二层(从左到右访问结点)-> ··· -> 最后一层(从左到右访问结点)
结果:20、10、50、6、15、30、78、90
如若有错误,请指正,非常感谢
API中Comparator接口的使用
@FunctionalInterface public interface Comparator<T>
比较功能,对一些对象的集合施加了一个整体排序 。
示例
-
创建一个实体类
package com.qfedu.demo; /** * @Author pengyu * @Date 2022/8/4 10:54 */ public class Person { private String name; private int age; public Person(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 "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
-
创建自己的排序规则:age小的在前
package com.qfedu.demo; import java.util.Comparator; /** * @Author pengyu * @Date 2022/8/4 10:56 */ public class MyComparator implements Comparator<Person> { /** * 根据age的差值进行比较排序 * 负数(小),零(相等),正数(大) * @param o1 * @param o2 * @return */ @Override public int compare(Person o1, Person o2) { return o1.getAge() - o2.getAge(); } }
-
测试
package com.qfedu.demo; import java.util.Set; import java.util.TreeSet; /** * @Author pengyu * @Date 2022/8/4 10:57 */ public class Test01 { public static void main(String[] args) { Set<Person> set = new TreeSet<>(new MyComparator()); set.add(new Person("涵涵", 21)); set.add(new Person("依依", 20)); set.add(new Person("欣欣", 19)); //age值一样,TreeSet集合不能存重复值 set.add(new Person("鱼鱼", 19)); System.out.println(set); } }
内部类
概述:内部类即在一个类中又定义一个类
内部类分类
- 成员内部类,类定义在方法外在某个类中
- 局部内部类,类定义在方法中
成员内部类(LinkedList的底层有在使用该成员内部类)
语法格式
class 外部类{
// 成员变量
// 成员方法
class 内部类{
// 成员变量
// 成员方法
}
}
示例
package com.qfedu.demo;
/**
* @Author pengyu
* @Date 2022/8/4 19:45
*/
class A {
String name = "卡哇伊";
int age = 28;
public void print() {
System.out.println("打印不了内部类B的属性和方法");
}
class B {
String name = "依依";
public void say () {
//打印外部类的属性
System.out.println(A.this.name);
System.out.println(A.this.age);
//打印内部类的属性
System.out.println(name);
}
}
}
public class Demo01 {
public static void main(String[] args) {
//我们如何使用成员内部类呢
//第一种创建格式
//1.实例化外部类对象
A a = new A();
//2.通过外部类对象来创建内部类对象
A.B b = a.new B();
b.say();
//第二种创建格式
//外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
A.B b1 = new A().new B();
}
}
控制台输出
卡哇伊
28
依依说明了内部类可以调用外部类的属性和方法
局部内部类(基本不用)
语法格式
class 外部类名 {
数据类型 变量名;
修饰符 返回值类型 方法名(参数列表) {
// …
class 内部类 {
// 成员变量
// 成员方法
}
}
}
匿名内部类
本质
- 定义没有名字的内部类
- 重写方法
- 创建没有名字的类的对象
抽象类中使用匿名内部类
package com.qfedu.demo;
/**
* @Author pengyu
* @Date 2022/8/4 19:54
*/
abstract class C {
public abstract void say();
}
public class Demo02 {
public static void main(String[] args) {
C c = new C() {
@Override
public void say() {
System.out.println("哈哈哈哈哈哈哈哈哈哈哈");
}
};
c.say();
//控制台输出:哈哈哈哈哈哈哈哈哈哈哈
}
}
接口中使用匿名内部类
package com.qfedu.demo;
/**
* @Author pengyu
* @Date 2022/8/4 20:01
*/
interface D {
void say();
}
public class Demo03 {
public static void main(String[] args) {
new D(){
@Override
public void say() {
System.out.println("我是D");
}
}.say();
//控制台打印:我是D
}
}