我(递归)定义了一个实现二叉树的类(在Java中):
class BinaryTree {
protected int key;
protected BinaryTree left, right;
// some methods...
}
我想从中实现二进制搜索树,如下所示:
class BinarySearchTree extends BinaryTree {
// ...
public BinarySearchTree search(int x) {
if (x == key)
return this;
if (x < key)
if (left != null)
return left.search(x); // (*)
else
if (right != null)
return right.search(x); // (*)
return null;
}
}
但当然标有// (*)
的行不会被编译为left
而right
只是BinaryTree
s,没有任何search()
方法
所以我想知道是否有一种方法来定义来自BinarySearchTree
超类的BinaryTree
,但是 left
和right
实际{ {1}}秒。
或许有更好的方法来实现二叉树和搜索之间的关系:我应该定义一个单独的BinarySearchTree
类吗?我应该使用模板吗?我应该避免递归定义吗? ...
答案 0 :(得分:6)
您可以使用递归泛型。
定义一个递归泛型类型变量,比如B
:
class BinaryTree<B extends BinaryTree<B>> {
并制作此类型的字段:
protected B left, right;
然后定义:
class BinarySearchTree extends BinaryTree<BinarySearchTree> {
现在left
和right
的类型为BinarySearchTree
,您可以拨打left.search
和right.search
。
答案 1 :(得分:1)
我觉得BinaryTreeNode
应该被创建为BinaryTree.java
的内部类。 BinaryTreeNode可以有int data
,BinaryTreeNode
和left
节点的right
类型的两个引用
BinaryTree.java
应该有BinaryTreeNode
类型的引用,它将是树的根。
现在BinarySearchTree extends BinaryTree
看起来不错,您可以在其中包含一个方法,如下所示。
BinaryTreeNode `search( int k, BinaryTreeNode root)`
现在您可以定义递归方法。
请参阅基本骨架的示例代码。
<强> BinaryTreeNode.java 强>
public class BinaryTreeNode {
private int data;
private BinaryTreeNode left, right;
public BinaryTreeNode(int data) {
this.setData(data);
}
public BinaryTreeNode getLeft() {
return left;
}
public void setLeft(BinaryTreeNode left) {
this.left = left;
}
public BinaryTreeNode getRight() {
return right;
}
public void setRight(BinaryTreeNode right) {
this.right = right;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
<强> BinaryTree.java 强>
public class BinaryTree {
protected BinaryTreeNode root;
// other basic methods needed for creating the Binary tree.
}
<强> BinarySearchTree.java 强>
public class BinarySearchTree extends BinaryTree {
public BinaryTreeNode search(int k) {
return search(k, root);
}
private BinaryTreeNode search(int k, BinaryTreeNode root) {
if (root.getData() == k) {
return root;
}
if (root.getData() < k) {
return search(k, root.getRight());
} else {
return search(k, root.getLeft());
}
}
// add other methods needed for creating the Binary search tree.
// also override the methods which needs to be modified for their behavior
// for binary search tree
}