将二叉搜索树扩展为红黑树

时间:2018-08-17 00:42:40

标签: java inheritance

我实现了一个简单的二进制搜索树。我想创建一个子类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字段。

2 个答案:

答案 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)

您可以分别保留rootBST的{​​{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; } } 将必须覆盖RBTcreateNode

insert