结构理解:
将第一个节点作为根节点,通过某一条件,大于的放在右子树,小于的放在左子树。此时进行查询的话时间复杂度就是O(logn),因为在查询的时候不会进行整个结构的查询。
二叉树中有三种遍历方式:前序遍历、中序遍历、后序遍历。
二叉树的基础实现:
实现二叉树的关键在于数据的保存,并且会涉及到数据的比较,那么就需要比较器的支持,而首选的比较器就是Comparable接口 。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
BinaryTree<Person> tree = new BinaryTree<>();
tree.add(new Person("张三",90));
tree.add(new Person("李四",40));
tree.add(new Person("王五",30));
tree.add(new Person("牛二",60));
tree.add(new Person("大黄",100));
System.out.println(Arrays.toString(tree.toArray()));
}
}
class BinaryTree<T extends Comparable<T>> {
/**
* 实现二叉树的操作
*/
private class Node {
private Comparable<T> data; // 存放Comparable,可以比较大小
private Node paerent; // 父节点
private Node left; // 保存左子树
private Node right; // 保存右子树
public Node(Comparable<T> data) { // 构造方法直接进行数据的存储
this.data = data;
}
public void addNode(Node newNode) { // 实现节点数据的适当位置存储
if (newNode.data.compareTo((T) this.data) <= 0) { // 比当前节点数据小
if (this.left == null) { // 左子树为空
this.left = newNode; // 保存左子树
newNode.paerent = this; // 保存父节点
} else { // 左子树不为空,则继续判断
this.left.addNode(newNode); // 向下进行递归判断
}
} else { // 比当前节点数据大
if (this.right == null) { // 右子树为空
this.right = newNode; // 保存右子树
newNode.paerent = this; // 保存右子树
} else { // 右子树不为空,则继续判断
this.right.addNode(newNode); // 向下进行递归判断
}
}
}
// 实现数据的获取处理,按照中序遍历来进行
public void toArrayNode() {
if (this.left != null) { // 左子树存在
this.left.toArrayNode(); // 递归
}
BinaryTree.this.returnData[BinaryTree.this.foot ++] = this.data;
if (this.right != null){
this.right.toArrayNode();
}
}
}
// -------------- 二叉树的功能实现 -------------
private Node root; // 根节点
private int count; // 数据的个数
private Object[] returnData; // 以数组的形式返回数据
private int foot; // 脚标
// 进行数据的保存
public void add(Comparable<T> data) {
if (data == null) {
throw new NullPointerException("保存数据为空");
}
// 所有数据本身不具备节点关系的匹配,那么一定要将其包装在Node类中
Node newNode = new Node(data);
if (this.root == null) { // 没有根节点则第一个节点作为根节点
this.root = newNode;
} else { // 根节点存在,需要根据判断得出保存的位置进行保存
this.root.addNode(newNode); // 交给Node类进行处理
}
this.count++; // 个数加一
}
// 以对象数组的形式进行数据的返回,如果没有数据则返回空
public Object[] toArray() {
if (this.count == 0) { // 没有数据返回空
return null;
}
this.returnData = new Object[this.count]; // 保存长度为数组长度
this.foot = 0; // 脚标清零
this.root.toArrayNode(); // 直接通过Node类
return this.returnData; // 返回数据
}
}
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person person) {
return this.age - person.age;
}
@Override
public String toString() {
return "name: " + this.name + " age: " + this.age;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)