Java语言基础-比较器和二叉树基础实现
程序员文章站
2022-06-21 14:14:57
在实现二叉树的处理之中最为关键性的问题在于数据的保存,而且数据由于牵扯到对象比较的问题,那么一定要有比较器的支持,而这个比较器首先的一定就是Comparable,所以本次将保存一个Person类数据:class Person implements Comparable {private String name;private int age;public Person(String name, int age) {super();this.name =...
在实现二叉树的处理之中最为关键性的问题在于数据的保存,而且数据由于牵扯到对象比较的问题,那么一定要有比较器的支持,而这个比较器首先的一定就是Comparable,所以本次将保存一个Person类数据:
class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public int compareTo(Person per) { return this.age - per.age; } // setter、getter略 @Override public String toString() { return "【Person类对象】姓名" + this.name + "、年龄" + this.age + "\n" ; } }
随后如果要想进行数据的保存,首先一定需要有一个节点类。节点类里面由于牵扯到数据的保存问题,所以必须使用Comparable(可以区分大小)
package cn.mldn.demo; import java.util.Arrays; public class JavaAPIDemo { public static void main(String[] args) throws Exception { BinaryTree<Person> tree = new BinaryTree<Person>(); tree.add(new Person("小强-80",80)); tree.add(new Person("小强-30",30)); tree.add(new Person("小强-50",50)); tree.add(new Person("小强-60",60)); tree.add(new Person("小强-90",90)); System.out.println(Arrays.toString(tree.toArray())); } } /**
* 实现二叉树操作
* @param <T> 要进行二叉树的实现
*/ class BinaryTree<T extends Comparable<T>> { private class Node { private Comparable<T> data ; // 存放Comparable,可以比较大小 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() { 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 = 0 ; // 脚标控制 /**
* 进行数据的保存
* @param data 要保存的数据内容
* @exception NullExpression 保存数据为空时抛出的异常
*/ 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 ++ ; } /**
* 以对象数组的形式返回全部数据,如果没有数据返回null
* @return 全部数据
*/ 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) { super(); this.name = name; this.age = age; } @Override public int compareTo(Person per) { return this.age - per.age; } // setter、getter略 @Override public String toString() { return "【Person类对象】姓名" + this.name + "、年龄" + this.age + "\n" ; } }
在进行数据添加的时候只是实现了节点关系的保存,而这种关系保存后的结果就是所有的数据都属于有序排列。
本文地址:https://blog.csdn.net/kenidi8215/article/details/108850874
推荐阅读
-
java基础第十二篇之集合、增强for循环、迭代器和泛型
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第25章:ClassLoader类加载器:课时115:ClassLoader类加载器简介
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第1章:Java多线程编程:课时3:Thread类实现多线程
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第24章:反射与简单Java类:课时110:属性自动赋值实现思路
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第25章:ClassLoader类加载器:课时116:自定义ClassLoader处理类
-
java语言基础之标识符和命名规则详解
-
java基础知识(赋值运算符,算术运算符和比较运算符)
-
Java语言基础—标识符、注释和关键字
-
Java语言基础-比较器和二叉树基础实现
-
C 语言基础实现青蛙跳台阶和汉诺塔问题