我通过使用树接口和递归创建二进制搜索树(我知道使用节点类我可以实现相同的)提供添加和检查元素是否在二进制搜索树中的方法。
我面临的问题是实例化&显示BST的元素。
这是我的代码
树界面:
package bst;
public interface Tree<D extends Comparable>{
public boolean isempty();
public int cardinality();
public boolean member(D elt);
public NonEmptyBst<D> add(D elt);
}
EmptyBst类:
package bst;
public class EmptyBst<D extends Comparable> implements Tree<D>{
public EmptyBst(){
D data=null;
}
@Override
public boolean isempty() {
// TODO Auto-generated method stub
return true;
}
@Override
public int cardinality() {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean member(D elt) {
// TODO Auto-generated method stub
return false;
}
@Override
public NonEmptyBst<D>add(D elt) {
// TODO Auto-generated method stub
return new NonEmptyBst<D>(elt);
}
}
NonEmptyBst类
package bst;
public class NonEmptyBst<D extends Comparable> implements Tree<D> {
D data;
D root;
Tree<D> left;
Tree <D>right;
public NonEmptyBst(D elt){
data=elt;
root=elt;
left=new EmptyBst<D>();
right=new EmptyBst<D>();
}
NonEmptyBst(){
D dataThis=this.data;
}
public NonEmptyBst(D elt,Tree<D>leftTree,Tree<D>rightTree){
data=elt;
left=leftTree;
right=rightTree;
}
@Override
public boolean isempty() {
// TODO Auto-generated method stub
return false;
}
@Override
public int cardinality() {
// TODO Auto-generated method stub
return 1+left.cardinality()+right.cardinality();
}
public boolean member(D elt) {
if (data == elt) {
return true;
} else {
if (elt.compareTo(data) < 0) {
return left.member(elt);
} else {
return right.member(elt);
}
}
}
public NonEmptyBst<D> add(D elt) {
if (data == elt) {
return this;
} else {
if (elt.compareTo(data) < 0) {
return new NonEmptyBst(data, left.add(elt), right);
} else {
return new NonEmptyBst(data, left, right.add(elt));
}
}
}
}
BinarySearchTree类
package bst;
import bst.Tree;
import bst.EmptyBst;
import bst.NonEmptyBst;
public class BinarySearchTree {
public static void main(String[] args) {
// TODO Auto-generated method stub
NonEmptyBst abcd=new NonEmptyBst( "abc");
NonEmptyBst ab=new NonEmptyBst(67);
abcd.add("cry me a river");
abcd.add("geeehfvmfvf");
abcd.add("I'm Sexy and i know it");
abcd.add("zzzzsd");
abcd.add("zzzzsd");
abcd.add("zzzfdsf");
abcd.add("zzfedfrsd");
abcd.add("tgrgdzsd");
abcd.add("gtrgrtgtrgtrzzzzsd");
abcd.add("zzzzsd");
abcd.add("zdddzzzsd");
abcd.add("zzzzsd");
abcd.add("zzzzsd");
}
}
**
如何在所有节点上访问数据然后将它们打印出来?我遇到的特殊问题是在获取异常时ClassCastException
当我访问&#34;叶节点&#34;即使我在我的new NonEmptyBst<D>
NonEmptyBst<D>(D elt)
中初始化constructor
,我最终还是有一个空指针异常
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.compareTo(Unknown Source)
at java.lang.String.compareTo(Unknown Source)
at bst.NonEmptyBst.add(NonEmptyBst.java:51)
at bst.NonEmptyBst.add(NonEmptyBst.java:54)
at bst.BinarySearchTree.main(BinarySearchTree.java:11)
答案 0 :(得分:3)
除非您尝试遵循Null对象的设计模式,否则我不确定是否需要EmptyBst
。
具体而言,&#34;空&#34;如果data == null && left == null && right == null
,可以轻松检查树。此外,这里不需要data
,因为它是一个局部变量而且从未被引用过。
public EmptyBst(){
D data=null;
}
D data
和D root
之间有区别吗?
我认为您需要调整add
方法来捕获递归的结果。
public NonEmptyBst<D> add(D elt) {
if (data == elt) {
return this;
} else {
if (elt.compareTo(data) < 0) {
this.left = this.left.add(elt);
} else {
this.right = this.right.add(elt);
}
}
return this;
}
答案 1 :(得分:0)
您需要递归访问它。由于我没有您的节点实现,我将编写一个通用示例:
// Return a list with all the nodes
public List<Node> preOrder() {
List<Node> l = new ArrayList<Node>();
l.add(this.value); // Add the data of the root
if(this.left != null) // Add elements to the left
l.addAll(this.left.preOrder());
if(this.right != null) // Add elements to the right
l.addAll(this.right.preOrder());
return l;
}
然后你只需要打电话:
List<Node> nodes = myTree.preOrder();
然后遍历列表以执行任何操作。