Comparable比较器排序远离实现
package test.java.api.api13; /**
* 手工实现二叉树的比较算法: 第一遍感觉很神秘,但是真正自己写下来,就感觉很简单,理解就好: 主要一下两点: 第一点:【设置一个根节点】
* 第二点:新增节点处理:比根节点小,放在左子树(如果左子树不存在,直接放在左子树,如果存在,用已经存在的左子树的节点递归调用)
* 第三点:新增节点处理:比根节点大或等于,放在右子树(如果右子树不存在,直接放在右子树,如果存在,用已经存在的右子树的节点递归调用)
* 第四点:打印输出:已经排好序的数据用中序遍历:左→根→右,进行输出
*
* @author gmq
* @dateTime 2015/11/1
*
*/
public class ComparableDemo03 { public static void main(String[] args) {
BinaryTree<Integer> bt = new BinaryTree<Integer>();
bt.add(8);
bt.add(7);
bt.add(6);
bt.add(11);
bt.add(8);
bt.add(9);
bt.add(3); System.out.println("排序之后的结果:");
bt.print();
}
} /**
* 二叉树算法类
*
* @author gmq
*
*/
class BinaryTree<T> { class Node { // 声明一个节点类Node
private Comparable<T> data; // 保存具体的内容
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; // 直接将新的节点设为左子树
} else {
this.left.addNode(newNode); // 继续向下判断
}
} if (newNode.data.compareTo((T) this.data) >= 0) { // 放在右子树
if (this.right == null) { // 判断右子树是否存在
this.right = newNode; // 右子树不存在:直接将新的节点放在右子树
} else {
this.right.addNode(newNode); // 继续向下判断
}
}
} public void print() { // 输出的时候采用中序遍历: 左→根→右
// 先遍历左节点
if (this.left != null) {
left.print();
} // 再遍历根节点
System.out.print(this.data + "\t"); // 最后遍历右节点
if (this.right != null) {
this.right.print();
}
}
} private Node root; // 跟节点 public void add(Comparable<T> data) {
Node newNode = new Node(data);
if (root == null) {
root = newNode;
} else {
root.addNode(newNode);
}
} public void print() {
this.root.print(); // 通过根节点输出
}
}