利用二叉树结构以及遍历方式可以实现基于二叉树的元素排序处理。
首先根据插入元素的大小与根节点大小的比较来构建一颗完整的树。
在构建好二叉树之后,并没有继续排序,所以我们需要使用一个中序遍历,因为中序遍历的顺序是左-根-右
5-8-9-11-12-20,神奇吧,我也觉得是!至于为什么呢?数学原理回头再说吧!
/*
* 基于二叉树结构实现元素排序处理的排序器
*/
public class BinaryTreeSort<E extends Integer> {
/*
* 定义结点类
*/
class Node<E extends Integer>{
private E item; //存放元素
private Node left; // 存放左子树地址
private Node right; //存放右子树地址
//添加构造方法
Node(E item){
this.item =item;
}
/*
* 添加结点
*/
public void addNode(Node node) {
//完成新结点中的元素与当前结点中的元素判断
//如果新结点中的元素小于当前节点中的元素,那么新结点则放到当前结点的左子树中
if(node.item.intValue()<this.item.intValue()) {
//判断是否有左子树
if(this.left == null) {
this.left = node;
}else {
this.left.addNode(node); //调用递归
}
}else {//如果新结点中的元素大于当前节点中的元素,那么新结点则放到当前结点的右子树中
if(this.right==null) {
this.right = node;
}else {
this.right.addNode(node);
}
}
}
/*
* 使用中序遍历二叉树
*/
public void inorderTraversal() {
//找到最左侧的那个结点
if(this.left!=null) this.left.inorderTraversal();
System.out.println(this.item);
//找到最右侧的那个结点
//在这里使用的是递归的方式,这个中序遍历很重要,自己画一画
if(this.right!=null) this.right.inorderTraversal();
}
}
private Node root; //存放树的根节点的地址
/*
* 将元素添加到排序器中
*/
public void add(E element) {
//要牢牢地抓住树的根节点,实例化结点对象
Node<E> node = new Node<>(element);
//判断当前二叉树中是否有根节点,如果没有,那么新节点则为根节点
if(this.root == null) {
this.root = node;
}else {
this.root.addNode(node);
}
}
/*
* 对元素进行排序
*/
public void sort() {
//判断根节点是否为空
if(this.root == null) {
return;
}else {
this.root.inorderTraversal();
}
}
public static void main(String[] args) {
BinaryTreeSort<Integer> tree = new BinaryTreeSort<>();
//1,8,6,3,5,2
tree.add(1);
tree.add(8);
tree.add(6);
tree.add(3);
tree.add(5);
tree.add(2);
tree.sort();
}
}