我正在尝试为多态二叉搜索树编写一个size()方法。也就是说,BST具有EmptyTree和NoneptyTree类,这两个类都实现了“树”接口。EmptyTree用于表示空树或子树,而不是null(如在常规BST中)
public interface Tree<K extends Comparable<K>, V> {
public int size();
public NonEmptyTree<K, V> add(K key, V value);
//bunch of other methods
}
我让EmptyTree和NoneptyTree从树接口实现size()方法,如下所示:
public int size() { //in EmptyTree class
return 0;
}
public int size() { //in NonEmptyTree class
return 1 + left.size() + right.size();
}
然而,当我试图在测试中运行这个:
Tree<Integer, String> treeThree = EmptyTree.getInstance(); //EmptyTree is a singleton class
treeThree = treeThree.add(3, "3");
treeThree = treeThree.add(2, "2");
treeThree = treeThree.add(1, "1");
treeThree = treeThree.add(4, "4");
assertEquals(4, treeThree.size());
它说树的大小是3,而不是4。
不过,对于这些人来说,这很管用:
Tree<Integer, String> empty = EmptyTree.getInstance();
assertEquals(0, empty.size());
Tree<Integer, String> treeOne = EmptyTree.getInstance();
treeOne = treeOne.add(2, "2"); treeOne = treeOne.add(1, "1"); treeOne = treeOne.add(3, "3");
assertEquals(3, treeOne.size());
Tree<Integer, String> treeTwo = EmptyTree.getInstance();
treeTwo = treeTwo.add(3, "3"); treeTwo = treeTwo.add(2, "2");
assertEquals(2, treeTwo.size());
EmptyTree添加方法:
public NonEmptyTree<K, V> add(K key, V value) {
return new NonEmptyTree(key, value);
}
非空树添加方法:
public NonEmptyTree<K, V> add(K key, V value) {
if(this.key.compareTo(key) == 0) {
this.value = value;
return this;
}
else {
if(key.compareTo(this.key) < 0) {
if(this.left.lookup(key) == null) {
this.left = new NonEmptyTree<K,V>(key, value);
return this;
}
else
return this.left.add(key, value);
}
else if(key.compareTo(this.key) > 0) {
if(this.right.lookup(key) == null) {
this.right = new NonEmptyTree<K,V>(key, value);
return this;
}
else
return this.right.add(key, value);
}
}
return this;
}
空树查找:
public V lookup(K key) {
return null;
}
非空树查找:
public V lookup(K key) {
if(key.compareTo(this.key) == 0)
return this.value;
else {
if(key.compareTo(this.key) < 0)
return this.left.lookup(key);
if(key.compareTo(this.key) > 0)
return this.right.lookup(key);
}
return null;
}
正如j_random_hacker在评论中所说,您不需要在add方法中调用查找方法。这将替换包含EmptyTree的整个子树作为其子树。将添加方法更改为:,
public NonEmptyTree<K, V> add(K key, V value) {
if(this.key.compareTo(key) == 0) {
this.value = value;
}
else {
if(key.compareTo(this.key) < 0) {
this.left = this.left.add(key, value);
}
else {
this.right = this.right.add(key, value);
}
}
return this;
}
我用java编写了一个实用的二叉搜索树,除了一个关键的函数,搜索。我使用的逻辑是,我将检查根是否为空,然后我要搜索的术语是否等于根(所以返回根)或>根(所以搜索右子树)或 使用printlns查看正在发生的事情,我发现如果值在那里,它将通过正确的if语句(包括将BNode n设置为找到的值),但随后由于某种原因将再次通过方法(返回null)。 这个方法唯一起作用的时候是在搜索根节点的时候,这对我来
问题在于从搜索函数返回的MyClass对象(mc)。 我跟踪到Search()并确保“r- “退货”有什么问题吗 谢啦! 我有点困惑。。我可以改为“数据类型BST::搜索(常量字符串名称)”而不是“数据类型*BST::搜索(常量字符串名称)”。。。。编译器似乎无法通过。返回NULL将有一些问题。。。 但是我尝试了你的方法来更改DataType*没有de::getIthem()它仍然有错误.....
我正在学习C++语言,我正在尝试编写BST,但是出了问题。我尝试添加元素到空树,根是NULL,但添加元素后,根仍然是NULL,尽管添加成功了(我在调试模式下看到,节点设置为tmp)。我不知道为什么会这样。
我很难按我教授想要的格式打印出一个二叉搜索树。 他的格式是这样的: 我的代码:
我有一个整数的二叉搜索树,包括1、2、...、9。我的遍历方法工作,我知道节点在那里,并且以正确的顺序。 我在纸上写下了当我搜索一个值时发生的事情,它返回根是没有意义的。我做错了什么?