
废话不多说,直接上代码。
package datastruct;
/**
* 排序二叉树(搜索二叉树)
*/
public class Tree<E extends Comparable<E>> {
//root用来保存根节点的引用
private Node root;
//节点的个数
private int size;
/**
* 描述二叉树当中的一个节点。
*/
private class Node {
//data用来保存添加的元素,这些元素应该实现Comparable接口,方便比较大小
E data;
//left,right用来保存左右子节点的引用
Node left;
Node right;
public Node(E e) {
this.data = e;
}
/**
* 将新节点添加到当前节点下面
*
* @param e 要添加的节点
* @return 添加成功,返回true
*/
public boolean addChild(E e) {
/*
*新节点的元素值与当前节点的元素值相等,则不用添加
* 注:
* 二叉树不允许重复元素
*/
if (e.compareTo(this.data) == 0) {
return false;
} else if (e.compareTo(this.data) < 0) {
/*
* 新节点的元素值比当前节点的元素值小,
* 则新节点应该添加到当前节点的左子树上
*/
if (this.left == null) {
//左子树为空,则新节点作为当前节点的左子树
this.left = new Node(e);
size++;
return true;
} else {
return left.addChild(e);
}
} else if (e.compareTo(data) > 0) {
/*
* 新节点的元素值比当前节点的元素值大,
* 则新节点应该添加到当前节点的右子树上
*/
if (this.right == null) {
this.right = new Node(e);
size++;
return true;
} else {
return right.addChild(e);
}
} else {
return false;
}
}
/**
* 对当前节点进行中序遍历,并且将当前节点元素的值添加到builder对象里面
*
* @param builder
*/
public void appendTo(StringBuilder builder) {
//先中序遍历左子树
if (this.left != null) {
this.left.appendTo(builder);
}
//访问根节点
builder.append(this.data + ",");
//中序遍历右子树
if (this.right != null) {
this.right.appendTo(builder);
}
}
}
/**
* 将元素添加到二叉树合适的位置
*
* @param e 被添加的元素
* @return 添加成功返回true
*/
public boolean add(E e) {
Node node = new Node(e);
if (root == null) {
//当前二叉树为空,则该节点为根节点
root = node;
root.left = null;
root.right = null;
//节点个数加1
size++;
return true;
} else {
//当前二叉树不为空,则将该节点作为根节点的子节点进行添加
return root.addChild(e);
}
}
/**
* 将二叉树按照中序遍历的方式输出所有节点的元素值
*
* @return
*/
@Override
public String toString() {
if (root == null) {
return "[]";
}
StringBuilder builder = new StringBuilder("[");
root.appendTo(builder);
builder.delete(builder.lastIndexOf(","), builder.length());
return builder.append("]").toString();
}
}
网友评论