2016-08-28 46 views
2

我有(递归)中定义的类实现二叉树(在Java中):OOP:继承与递归类定义

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()方法。

所以我想知道如果那里有一种方法可以定义从BinaryTreeBinarySearchTreeleftright实际上是BinarySearchTree秒。

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

+0

是什么在这里有两个不同的阶级意义呢?为什么不直接在BinaryTree中放入search()方法并忘记BinarySearchTree? –

+0

是的,但是允许在一个没有组织成二进制*搜索树的二叉树内使用'search()'方法会是“危险的”,因为当树长大时该方法会变得计算上难以处理:“BinaryTree”搜索会是强力的,而BinarySearchTree保证最多是对数的,但这更多的是关于算法和数据结构而不是OOP :) – Giorgio

+1

比泛型解决方案更清洁的设计是将二叉树作为接口并制作一个简单的二叉树实现以及一个二叉搜索树 –

回答

5

您可以使用递归泛型。

定义递归泛型类型变量,说,B

class BinaryTree<B extends BinaryTree<B>> { 

,使你这种类型的字段:

protected B left, right; 

然后定义:

class BinarySearchTree extends BinaryTree<BinarySearchTree> { 

现在leftright类型为也可以拨打left.searchright.search

+0

我不知道泛型(我刚刚从两个月前的C++中移除),但您的解决方案可能正是我所需要的,谢谢 – Giorgio

+0

The唯一不足的是我可以看到的是,对于普通的'BinaryTree's,你必须输入稍详细的'BinaryTree '。 – qxz

+0

@qxz会是一个原始类型。是的,这相当丑陋。 –

1

我觉得BinaryTreeNode应该被创建为BinaryTree.java的内部类。 BinaryTreeNode可以具有int data,以及用于leftright节点

BinaryTree.java应具有BinaryTreeNode类型的参考,这将是该树的根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; 
    } 

} 

二叉树。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 
} 
+0

但等待:成为'BinaryTreeNode's,'left'和'right'没有任何'search()'方法,对吧? – Giorgio

+0

@George,BinaryTreeNode没有搜索方法。它是BinarySearchTree扩展BinaryTree,它将包含搜索方法。 BinaryTree包含对BinaryTreeNode对象的引用。 –

+1

哦,现在我明白了:所以我必须调用'search(x,left);'。好吧,我想这也可以,谢谢! – Giorgio