OOP:使用递归类定义继承

时间:2016-08-28 15:02:05

标签: java class oop inheritance recursion

我(递归)定义了一个实现二叉树的类(在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;
    }
}

但当然标有// (*)的行不会被编译为leftright只是BinaryTree s,没有任何search()方法

所以我想知道是否有一种方法来定义来自BinarySearchTree超类BinaryTree,但是 leftright实际{ {1}}秒。

或许有更好的方法来实现二叉树和搜索之间的关系:我应该定义一个单独的BinarySearchTree类吗?我应该使用模板吗?我应该避免递归定义吗? ...

2 个答案:

答案 0 :(得分:6)

您可以使用递归泛型。

定义一个递归泛型类型变量,比如B

class BinaryTree<B extends BinaryTree<B>> {

并制作此类型的字段:

protected B left, right;

然后定义:

class BinarySearchTree extends BinaryTree<BinarySearchTree> {

现在leftright的类型为BinarySearchTree,您可以拨打left.searchright.search

答案 1 :(得分:1)

我觉得BinaryTreeNode应该被创建为BinaryTree.java的内部类。 BinaryTreeNode可以有int dataBinaryTreeNodeleft节点的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
}