java 泛型树_泛型的二叉搜索树,请指点

泛型的二叉搜索树,请指点

小弟初学java,写了一个泛型的二叉搜索树(源代码见后)。

IBSTree接口定义一个二叉搜索树的对外接口,这个接口描述了二叉搜索树的所有对外可见的行为。具体的方法描述见源代码的注释。

IBSTree接口中有定义了一个二叉搜索树的节点类型的接口IBSTNode(这个接口也可以在IBSTree接口的外部定义,只是这个接口太小,个人觉得没必要单独定义),

这个接口描述了二叉搜索树的一个节点的对外可以的部分(对外只是可以获取节点的值)。

然后再定义了两个类BSTNode和BSTree,分别实现了这两个接口。

这个设计有点复杂,自己都觉得不够清爽

13a2f4bd84d8af35e7645442bb7a26a3.gif

定义IBSNode纯粹是考虑到实现的效率,返回一个IBSNode的类可以传达更多的节点信息,尽管这些信息对外不可见,但是内部实现需要这些信息。

二叉搜索树的各个操作的实现没有做注释

13a2f4bd84d8af35e7645442bb7a26a3.gif,是由于这些操作在任何一本数据结构的书上都有详细的说明。

小弟主要关注的是泛型和程序的整个结构。

请各位路过的大虾指点一下,小弟万分感激。^-^

源文件共三个:IBSTree.java、BSTNode.java、BSTree.java。

文件1:IBSTree.java

package BinarySearchTree;

//二叉搜索树类型

public interface IBSTree> {

public interface IBSTNode {

Value getValue(); //获取二叉搜索树结点的键

boolean isEmpty(); //判断二叉搜索树结点是否为空

}

void makeEmptyBST(); //创建一棵空的二叉搜索树

boolean isEmptyBST(); //判断一棵二叉搜索树是否为空

IBSTNode search(Value k); //在二叉树搜索树中查找指定的键

boolean insert(Value k); //向二叉搜索树中插入键

IBSTNode getMax(); //获取二叉搜索树中的最大值

IBSTNode getMin(); //获取二叉搜索树中的最小值

IBSTNode succ(IBSTNode n); //获取后继

IBSTNode pred(IBSTNode n); //获取前驱

boolean delete(IBSTNode n); //删除二叉搜索树中的指定元素

}

文件2:BSTNode.java

package BinarySearchTree;

/**

*BSTNode类表示二叉搜索树的一个结点。

*BSTNode的值可以是:

* 1、EMPTY。表示这是一个空结点。

* 2、(key,left,right,parent)。其中key表示结点值,left表示左子树,right表示右子树,parent表示父节点。

*Value类型是一种实现了Comparable接口的类型。

*/

public final class BSTNode>

implements IBSTree.IBSTNode {

public Value getValue() { //获取二叉搜索树结点的键

if (this==EMPTY) return null;

else return this.key;

}

public boolean isEmpty() { //判断二叉搜索树结点是否为空

if (this==EMPTY) return true;

else return false;

}

static final BSTNode EMPTY=new BSTNode(null,null,null,null); //表示空的二叉树节点

BSTNode left;

BSTNode right;

BSTNode parent;

Value key;

BSTNode(Value key,BSTNode left,

BSTNode right,BSTNode parent) {

this.key=key;

this.left=left;

this.right=right;

this.parent=parent;

}

}

文件3:BSTree.java

package BinarySearchTree;

/**

*BSTree类表示二叉搜索树。

*Value类型是一种实现了Comparable接口的类型。

*/

public final class BSTree>

implements IBSTree {

public void makeEmptyBST() {//创建一棵空的二叉搜索树

root=BSTNode.EMPTY;

}

public boolean isEmptyBST() {//判断二叉搜索树结点是否为空

if (root==BSTNode.EMPTY) return true;

else return false;

}

public IBSTNode getMax() {//获取二叉搜索树中的最大值

if (root==BSTNode.EMPTY) return BSTNode.EMPTY;

else {

BSTNode p=root;

while ((p!=BSTNode.EMPTY)&&(p.right!=BSTNode.EMPTY))

p=p.right;

return p;

}

}

public IBSTNode getMin() {//获取二叉搜索树中的最小值

if (root==BSTNode.EMPTY) return BSTNode.EMPTY;

else {

BSTNode p=root;

while ((p!=BSTNode.EMPTY)&&(p.left!=BSTNode.EMPTY))

p=p.left;

return p;

}

}

public IBSTNode search(Value k) {//在二叉树搜索树中查找指定的键

BSTNode p=root;

while ((p!=BSTNode.EMPTY)&&(p.key.compareTo(k)!=0))

if (k.compareTo(p.key)<0) p=p.left;

else p=p.right;

return p;

}

public boolean insert(Value k) {//向二叉搜索树中插入键

if (root==BSTNode.EMPTY) {

root=new BSTNode(k,BSTNode.EMPTY,

BSTNode.EMPTY,BSTNode.EMPTY);

return true;

} else {

BSTNode p=root;

BSTNode q=root;

while ((p!=BSTNode.EMPTY)&&(p.key.compareTo(k)!=0))

if (k.compareTo(p.key)<0) {

q=p;

p=p.left;

} else {

q=p;

p=p.right;

};

if (p==BSTNode.EMPTY) {

p=new BSTNode(k,BSTNode.EMPTY,

BSTNode.EMPTY,BSTNode.EMPTY);

if (k.compareTo(q.key)<0) q.left=p;

else q.right=p;

return true;

} else return false;

}

}

public IBSTNode succ(IBSTNode n) {//获取后继

if (!(n instanceof BSTNode)) return BSTNode.EMPTY;

BSTNode m;

m=(BSTNode) n;

if (m==BSTNode.EMPTY) return BSTNode.EMPTY;

else {

if (m.right!=BSTNode.EMPTY) {

BSTree p=new BSTree(m.right);

return p.getMin();

} else {

BSTNode p=m;

BSTNode q=p.parent;

while ((q!=BSTNode.EMPTY)&&(q.right==p)) {

p=q;

q=p.parent;

}

if (q==BSTNode.EMPTY) return BSTNode.EMPTY;

else return q;

}

}

}

public IBSTNode pred(IBSTNode n) {//获取前驱

if (!(n instanceof BSTNode)) return BSTNode.EMPTY;

BSTNode m;

m=(BSTNode) n;

if (m==BSTNode.EMPTY) return BSTNode.EMPTY;

else {

if (m.left!=BSTNode.EMPTY) {

BSTree p=new BSTree(m.left);

return p.getMax();

} else {

BSTNode p=m;

BSTNode q=p.parent;

while ((q!=BSTNode.EMPTY)&&(q.left==p)) {

p=q;

q=p.parent;

}

if (q==BSTNode.EMPTY) return BSTNode.EMPTY;

else return q;

}

}

}

public boolean delete(IBSTNode n) {//删除二叉搜索树中的指定元素 ,没实现

13a2f4bd84d8af35e7645442bb7a26a3.gif

return true;

}

private BSTNode root;

private BSTree(BSTNode root){

this.root=root;

}

}

[此贴子已经被作者于2007-7-15 13:44:49编辑过]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值