二叉树

大家都知道,要对一个对象进行排序可以利用java提供的Comparable<T>接口和Arrays工具类实现。

在实现Comparable<T>接口时要实现下面的方法

public int compareTo(T t); 


 

 此方法返回1,0和-1。返回1表示升序,-1表示降序。0表示相等。

为什么要这样定义?出于好奇,我查看了源代码,发现此方法是利用了数据结构里面的平衡二叉树的排序原理。

为了巩固以前学过的数据结构知识,我现在通过java来实现下Binary Tree.

/**  
 * 二叉树  
 */  
public class BinaryTree<T> {   
    //树的节点   
    public class Node {   
        //节点上的数据   
        Comparable<T> data;   
        //左子树   
        Node lChild;   
        //右子树   
        Node rChild;   
           
        public Node(Comparable<T> data) {   
            this.data = data;   
        }   
        //添加一个节点   
        @SuppressWarnings("unchecked")   
        public void addNode(Node node) {   
            //若当前节点的数据比添加的节点的数据大,则将新节点放在此节点的左子树上   
            if (this.data.compareTo((T)node.data) == 1) {   
                //若当前节点的左子树为空,则直接创建新节点,放在其左子树上   
                if (this.lChild == null) {   
                    this.lChild = node;   
                } else {   
                    //递归调用   
                    this.lChild.addNode(node);   
                }                  
            } else { //新节点的数据大于等于当前节点的数据,则将其放到当前节点的右子树上   
                if (this.rChild == null) {   
                    this.rChild = node;   
                } else {   
                    this.rChild.addNode(node);   
                }   
            }   
        }   
        //中序遍历打印出当前节点为根的所有子节点   
        public void printNode() {   
            if (this.lChild != null) { //先遍历左子树   
                this.lChild.printNode();   
            }   
            System.out.print(this.data + " "); //打印根节点   
            if (this.rChild != null) { //再遍历右子树   
                this.rChild.printNode();   
            }   
        }   
    }   
    //根节点   
    private Node root;   
       
    //添加新节点   
    public void addNode(Node node) {   
        if (root == null) {   
            root = node;   
        } else {   
            root.addNode(node);   
        }   
    }   
    //打印树   
    public void printTree() {   
        root.printNode();   
    }   
       
    //测试类   
    public static class Test {   
        public static void main(String[] args) {   
            BinaryTree<Integer> tree = new BinaryTree<Integer>();   
            tree.addNode(tree.new Node(1));   
            tree.addNode(tree.new Node(10));   
            tree.addNode(tree.new Node(13));   
            tree.addNode(tree.new Node(111));   
            tree.addNode(tree.new Node(32));   
            tree.addNode(tree.new Node(19));   
            tree.addNode(tree.new Node(1));   
            tree.printTree();   
        }   
    }   
}  


 

打印出:

1 1 10 13 19 32 111   


 

 测试成功! 

总结:

返回1表示当前节点大于新添加的节点,因此要把新添加的节点放在当前节点的左子树上,反之加到当前节点的右子树上。

然后利用二叉树的中序遍历(先左子树,再根,再右子树)得到排序结果。这也就说明了comparaTo方法返回的-1,0和1的原因。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值