2016-08-28 45 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