二叉树可分为满二叉树、完全二叉树、平衡二叉树(二叉查找树)、最优二叉树(哈夫曼树),此篇代码实现的是普通二叉查找树。
中序遍历可以实现二叉树存储数据的顺序排序。
package unittest;
import java.util.Arrays;
/**Person类 二叉树存储的数据类型 可比较
* @author Dylaniou
*
*/
class Person implements Comparable<Person>{
private String name;
private int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return this.name + "-" + age;
}
@Override
public int compareTo(Person per) {
return this.age - per.age;
}
}
public class RealizeBinaryTree<T extends Person>{
private Node root;//一个二叉树有且仅对应一个根节点,通过根节点即可遍历到所有的二叉树节点
private int count;//计数器,用于记录二叉树存储的数据个数
Object[] inorderArrayData;//用于存储由二叉树中序遍历后组成的数组
private int foot;//脚标,用于遍历二叉树时使用
/**实现二叉树的基本数据结构类
* @author Dylaniou
*/
private class Node{
private Node parent;//父节点
private Node left;//左子节点
private Node right;//右子节点
private Comparable<Person> data;//节点上要存储的数据
Node(Comparable<Person> data){
this.data = data;
}
/**往二叉树中增加后续节点:小于当前节点加入左子树 大于当前节点加入右子树
* @param newNode
*/
private void addNode(Node newNode){
if(newNode.data.compareTo((Person) this.data)<=0){
//小于当前节点加入左子树
if(this.left==null){
this.left = newNode;
}else{
this.left.addNode(newNode);//要加入的位置已存在节点,则递归继续判断
}
}else{
//大于当前节点加入右子树
if(this.right==null){
this.right = newNode;
}else{
this.right.addNode(newNode);//要加入的位置已存在节点,则递归继续判断
}
}
}
/**
* 中序遍历:左中右
*/
public void inorderTraserval(){
if(this.left!=null){
this.left.inorderTraserval();//只要发现还有左子节点就继续递归
}
System.out.println("foot#"+ foot + (inorderArrayData[foot++] = this.data));
if(this.right!=null){
this.right.inorderTraserval();//只要发现还有右子节点就继续递归
}
}
}
/**往二叉树中添加数据 第一个添加的数据形成根节点,后续添加的数据在根节点的基础上,根据二叉树规则,形成二叉树结构
* @param data
*/
private void add(Comparable<Person> data){
if(data == null){
throw new NullPointerException("保存的数据不能为空!");
}
Node newNode = new Node(data);
if(this.root == null){
this.root = newNode;//第一个添加的数据形成根节点
}else{
this.root.addNode(newNode);//后续添加的数据在根节点的基础上,根据二叉树规则,形成二叉树结构
}
count++;
}
public static void main(String[] args) {
RealizeBinaryTree<Person> binaryTree = new RealizeBinaryTree<Person>();
binaryTree.add(new Person("PersonA",80));
binaryTree.add(new Person("PersonB",30));
binaryTree.add(new Person("PersonC",20));
binaryTree.add(new Person("PersonD",50));
binaryTree.add(new Person("PersonE",70));
binaryTree.inorderArrayData = new Object[binaryTree.count];
binaryTree.root.inorderTraserval();
System.out.println(Arrays.toString(binaryTree.inorderArrayData));
}
}