二叉树是一种比较高效的数据存储结构,那么怎么用java代码实现呢?
代码如下:
二叉树类:
public class BinaryTree<T extends Comparable<T>> {
// 定义一个只有二叉树自己使用的Node类用于保存二叉树的节点
private class Node {
private Comparable<T> data;// 用于存储数据
private Node parent;// 当前节点的父节点
private Node left; // 当前节点的左子节点
private Node right;// 当前节点的右子节点
public Node(Comparable<T> data) {
this.data = data;
}
/**
* 实现节点数据的适当位置的存储
* @param newNode 创建的新节点
*/
public void addNode(Node newNode){
if(newNode.data.compareTo((T) this.data)<=0){//比当前节点数据小
if(this.left == null){//没有左子树
this.left = newNode;//保存左子树
newNode.parent = this;//保存父节点
}else{//需要向下继续判断
this.left.addNode(newNode);
}
}else{//比当前节点数据大
if(this.right == null){//没有右子树
this.right = newNode;
newNode.parent = this;//保存父节点
}else{
this.right.addNode(newNode);//继续向下判断
}
}
}
/**
* 实现所有数据的获取处理,按照中序遍历的方式
*/
public void toArrayNode() {
// TODO Auto-generated method stub
//遍历左树
if(this.left != null){//有左子树
this.left.toArrayNode();//递归调用
}
BinaryTree.this.returnDate[BinaryTree.this.foot++] = this.data;//保存数据
//遍历右树
if(this.right != null){//有右子树
this.right.toArrayNode();//递归调用
}
}
}
//以下是二叉树的功能实现
private Node root;//保存的是根节点
private int count;//保存数据的个数
private int foot = 0;//脚标控制
private Object[] returnDate;//返回的数据
/**
* 进行数据的保存
* @param data要保存的数据
*/
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);
}
this.count++;
}
/**
* 返回数据
* @return
*/
public Object[] toArray(){
if(this.count==0){
return null;
}
this.foot = 0;//脚标清零
this.returnDate = new Object[this.count];
this.root.toArrayNode();//直接通过Node类负责
return this.returnDate;
}
}
Person类:
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
return this.age-o.age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "姓名:"+this.name+"、年龄:"+this.age+"\n";
}
}
测试类:
import java.util.Arrays;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
BinaryTree<Person> tree = new BinaryTree<>();
tree.add(new Person("张三", 20));
tree.add(new Person("李四", 17));
tree.add(new Person("王五", 19));
tree.add(new Person("赵六", 22));
tree.add(new Person("钱七", 15));
tree.add(new Person("哈皮", 18));
System.out.println(Arrays.toString(tree.toArray()));
}
}
运行结果: