【发布时间】:2016-08-28 15:02:05
【问题描述】:
我(递归地)定义了一个用于实现二叉树的类(在 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 只是BinaryTrees,没有任何search() 方法。
所以我想知道是否有一种方法可以从BinaryTree 超类但定义BinarySearchTree,而left 和right 实际上是BinarySearchTrees。
或者也许有更好的方法来实现二叉树和 搜索 之间的关系:我应该定义一个单独的 Node 类吗?我应该使用模板吗?我应该完全避免递归定义吗? ...
【问题讨论】:
-
这里有两个单独的类有什么意义?为什么不直接将 search() 方法放在 BinaryTree 中而忘记 BinarySearchTree?
-
是的,但是在未组织为二叉 search 树的二叉树中允许
search()方法将是“危险的”,因为当树长大了:BinaryTree搜索将是蛮力的,而BinarySearchTree保证最多是对数的。但这更多是关于算法和数据结构而不是 OOP :) -
一个可能比泛型解决方案更简洁的设计是使二叉树成为一个接口,并制作一个普通的二叉树实现以及二叉搜索树。
标签: java class oop inheritance recursion