我实现了一个简单的二进制搜索树。我想创建一个子类Red-Black Tree,但是遇到了问题。 BST的代码如下,删除了无关的详细信息。 BST可以正常工作。
节点:
public Node {
private int key;
public Node left;
public Node right;
public Node parent;
public Node(int key){
// init
}
}
BST:
public BinarySearchTree {
protected Node root;
public void insert(int key){
Node insertNode = new Node(key); // This is problematic
// perform insertion
}
}
我需要继承Node
来添加颜色属性:
RbtNode :
public RbtNode extends Node {
private boolean isBlack;
public RbtNode(int key){
// init
}
}
还有RedBlackTree
类
RedBlackTree
public RedBlackTree {
public void insert(int key){
super.insert(key);
// perform RBT fixes
}
}
如您所见,我想重用insert
的{{1}}方法,但是由于它插入的是BinarySearchTree
而不是Node
,因此无法使用
我想到的一个解决方案是创建一个可以覆盖的单独方法RbtNode
,但是在访问/操作子类上的节点时,我需要做很多类型转换。
有没有更清洁的解决方案,最好是没有类型转换的解决方案?
编辑:问题是从子类(RedBlackTree)调用createNode(int key)
时,它使用父类的super.insert
字段而不是子类的root
字段。
答案 0 :(得分:0)
尝试使用要创建Node
的工厂方法将要重用的树逻辑移动到通用超类:
public abstract class AbstractBinarySearchTree<T extends Node> {
protected T root;
public T insert(int key) {
T insertNode = newNode(key);
// perform insertion
return insertNode;
}
public abstract T newNode(int key);
}
具体BST只需使用工厂方法即可完成:
public class BinarySearchTree extends AbstractBinarySearchTree<Node> {
@Override
public Node newNode(int key) {
return new Node(key);
}
}
RBT覆盖insert方法和factory方法:
public class RedBlackTree extends AbstractBinarySearchTree<RbtNode> {
@Override
public RbtNode insert(int key){
RbtNode node = super.insert(key);
// perform RBT fixes
return node;
}
@Override
public RbtNode newNode(int key) {
return new RbtNode(key);
}
}
答案 1 :(得分:0)
您可以分别保留root
和BST
的{{1}}节点,并将通用逻辑移至单个插入方法
RBT
public class BST {
private Node root;
protected Node createNode(int key) {
//System.out.println("create BST node");
return new Node(key);
}
public void insert (int key) {
insert(key, root);
}
protected Node insert(int key, Node root) {
if (root == null) {
root = createNode(key);
return root;
}
if (key > root.key) {
root.left = insert(key, root.left);
} else if (key < root.key) {
root.right = insert(key, root.right);
}
return root;
}
}
将必须覆盖RBT
和createNode
insert