二叉树

大家都知道,要对一个对象进行排序可以利用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、付费专栏及课程。

余额充值