比较器(二叉树)
一、比较器二叉树释义
在之前学习过链表程序,链表程序的本质是在于节点的互相引用,但是之前的链表有一个缺点:
所有的保存数据顺序就是你的添加顺序,而且无法排序,如果要想进行排序的保存,就可以通过树的结构来完成。
- 二叉树的结构
1、二叉树的结构定义
取第一个数据作为树的根节点,而后比这个根节点大的数据放在节点的右子树,如果比根节点小的数据放在节点的左子树。
在进行输出的时候按照中序遍历的原则取出:左-中-右。
2、结构解析
比如:以数据99为根节点
80小于99,在99的左子树,成为一个中节点。120大于99,在99的右子树,成为另一个中节点。依次类推。
归纳:
这种树的结构实现的关键就是大小的比较,而这种大小的比较就可以使用Comparable接口来完成。
三、实现二叉树范例
打开simplework - Java EE -
MyProject/src/cn/mldn/demo
新建名称为BTDemo
录入程序
package cn.mldn.demo;
@SuppressWarnings("rawtypes")
class BinaryTree { // 现在实现一个二叉树
private class Node {
private Comparable data ;//保存的操作数据,因为必须是Comparable子类,而且需要判断大小
private Node left ; // 保存左边的节点
private Node right ; // 保存右边节点
@Suppres sWarnings ("unused")
public Node(Comparable data) {
this.data = data ;
}
@Suppres sWarnings ( "unchecked")
public void addNode(Node newNode) {
if (this . data . compareTo(newNode.data) > 0) {
if (this.left == nu11) {
this.left = newNode ;
} else {
this .1eft . addNode(newNode);
}
} else {
if (this.right == null) {
this.right = newNode ;
} else {
this. right . addNode ( newNode) ;
}
}
}
public void toArrayNode() {
if (this.left != nu1l) { // 右左节点
This.left.toArrayNode();
}
BinaryTree.this.retData[BinaryTree.this.foot++]=this.data ;
if (this.right != nu11) {
this .right . toArrayNode();|
}
}
}
//-------------------------------------------------------//
private Node root ; // 任何的数据结构一定要抓住根
private int count ; // 保存个数
private int foot = 0;
private object [] retData; //返回数据
public object [] toArray() {
this.foot = 0 ; //脚标清零
this.retData = new object [this.count] ;
this. root . toArrayNode() ;
return this.retData ;
}
public void add(object data) { //可以保存任何的数据
if (data == nu11) {
return ;
}
Node newNode = new Node( (Comparable) data) ;
if (this.root == nu11) {
this.root = newNode ;
} else {
this .root . addNode (newNode) ;
}
this.count ++ ;
}
}
public class BTDemo {
public static void main(String[] args) {
BinaryTree bt = new BinaryTree() ;
bt.add("B");
1. add("X");
bt.add( "A");
System.out.print1n(Arrays.tostring(bt.toArray()));
}
}
这就是一个最基本的二叉树。
如果要有兴趣可以继续将之前链表的功能在完整实现。