2016-08-12 68 views
-1

所以我在這個星期一的Java最終決定了,在課上我們討論了泛型,我認爲它很容易。我想用這本書中的一個例子來嘗試一下。所以我試圖製作一個通用樹。事情是,我的代碼看起來幾乎完全相同,除了我的課程中使用的例子不會工作。至於爲什麼,我很困惑。它告訴我,我在插入方法中缺少標識符。但就像我說的那樣,它看起來像教授做的和書中的例子之間的完美結合。我試圖尋找其他民族關於泛型的問題,但我更加困惑。簡單地說(有理由)有人可以向我解釋我做錯了什麼?如果你想知道什麼教科書它的Java如何通過的Deitel和Deitel公司編程Java通用樹可比較

// Tree.java 
// Definition of class TreeNode and class Tree. 
// class TreeNode definition 
class TreeNode<E extends Comparable<TreeNode<E>>> 
{ 

    TreeNode<E> leftNode; // left node 
    E data; // node value 
    TreeNode<E> rightNode; // right node 

    // constructor initializes data and makes this a leaf node 
    public TreeNode(E nodeData) 
    { 
     data = nodeData;    
     leftNode = rightNode = null; // node has no children 
    } // end TreeNode constructor 

    // locate insertion point and insert new node; ignore duplicate values 
    public void <E extends Comparable<TreeNode<E>>> insert(E insertValue) 
    { 
     // insert in left subtree 
     if (data.compareTo(insertValue) > 0) 
     { 
     // insert new TreeNode 
     if (leftNode == null) 
      leftNode = new TreeNode<E>(insertValue); 
     else // continue traversing left subtree 
      leftNode.insert(insertValue); 
     } // end if 
     else if (data.compareTo(insertValue) < 0) // insert in right subtree 
     { 
     // insert new TreeNode 
     if (rightNode == null) 
      rightNode = new TreeNode<E>(insertValue); 
     else // continue traversing right subtree 
      rightNode.insert(insertValue); 
     } // end else if 
    } // end method insert 
} // end class TreeNode 

// class Tree definition 
public class Tree<E> 
{ 
    private TreeNode<E> root; 

    // constructor initializes an empty Tree of integers 
    public Tree() 
    { 
     root = null; 
    } // end Tree no-argument constructor 

    // insert a new node in the binary search tree 
    public void insertNode(E insertValue) 
    { 
     if (root == null) 
     root = new TreeNode<E>(insertValue); // create the root node here 
     else 
     root.insert(insertValue); // call the insert method 
    } // end method insertNode 

    // begin preorder traversal 
    public void preorderTraversal() 
    { 
     preorderHelper(root); 
    } // end method preorderTraversal 

    // recursive method to perform preorder traversal 
    private void preorderHelper(TreeNode<E> node) 
    { 
     if (node == null) 
     return; 

     System.out.printf("%d ", node.data); // output node data 
     preorderHelper(node.leftNode);  // traverse left subtree 
     preorderHelper(node.rightNode);  // traverse right subtree 
    } // end method preorderHelper 

    // begin inorder traversal 
    public void inorderTraversal() 
    { 
     inorderHelper(root); 
    } // end method inorderTraversal 

    // recursive method to perform inorder traversal 
    private void inorderHelper(TreeNode<E> node) 
    { 
     if (node == null) 
     return; 

     inorderHelper(node.leftNode);  // traverse left subtree 
     System.out.printf("%d ", node.data); // output node data 
     inorderHelper(node.rightNode);  // traverse right subtree 
    } // end method inorderHelper 

    // begin postorder traversal 
    public void postorderTraversal() 
    { 
     postorderHelper(root); 
    } // end method postorderTraversal 

    // recursive method to perform postorder traversal 
    private void postorderHelper(TreeNode<E> node) 
    { 
     if (node == null) 
     return; 

     postorderHelper(node.leftNode);  // traverse left subtree 
     postorderHelper(node.rightNode);  // traverse right subtree 
     System.out.printf("%d ", node.data); // output node data 
    } // end method postorderHelper 
} // end class Tree 

這是我的駕駛類,這是一個片段作爲例子書:

// This program tests class Tree. 
import java.util.Random; 

public class TreeTest 
{ 
    public static void main(String args[]) 
    { 
     Tree tree = new Tree<E>(); 
     E value; 
     Random randomNumber = new Random(); 

     System.out.println("Inserting the following values: "); 

     // insert 10 random integers from 0-99 in tree 
     for (int i = 1; i <= 10; i++) 
     { 
     value = randomNumber.nextInt(100); 
     System.out.print(value + " "); 
     tree.insertNode(value); 
     } // end for 

     System.out.println ("\n\nPreorder traversal"); 
     tree.preorderTraversal(); // perform preorder traversal of tree 

     System.out.println ("\n\nInorder traversal"); 
     tree.inorderTraversal(); // perform inorder traversal of tree 

     System.out.println ("\n\nPostorder traversal"); 
     tree.postorderTraversal(); // perform postorder traversal of tree 
     System.out.println(); 
    } // end main 
} // end class TreeTest 
+1

你儘量不要使用' E()在main()中?像使用'Integer'代替? – Shark

+0

當你實例化'Tree'時,你需要告訴它'E'是什麼類型。 – jr593

+0

糟糕!原始類型:'樹形樹=新樹();'。嘗試'樹樹=新樹();' – Bohemian

回答

1

有幾個顯着的錯誤在你的實現中。

首先,您的TreeNodeTree類的泛型定義看起來是錯誤的。該TreeNodeE型和E應該是可比的(即實現了Comparable<E>接口。

因此,我認爲你應該定義你TreeNodeTree類,如下所示。

class TreeNode<E extends Comparable<E>> { 
    //other code 
} 

public class Tree<E extends Comparable<E>> { 
    //other code 
} 

然後,當您使用Tree你應該指定實際的泛型類型

例如你可以使用你的樹如下:

Tree tree = new Tree<Integer>(); 
tree.insertNode(100); 
tree.insertNode(200); 
tree.insertNode(150); 
tree.preorderTraversal(); 
0

下面一行是錯誤的

public void <E extends Comparable<TreeNode<E>>> insert(E insertValue) 

應該

public <E extends Comparable<TreeNode<E>>> void insert(E insertValue) 

代替,但是這不會解決所有的問題。正確的樹節點類應該是這樣的

class TreeNode<E extends Comparable<E>> { 

    TreeNode<E> leftNode; // left node 
    E data; // node value 
    TreeNode<E> rightNode; // right node 

    // constructor initializes data and makes this a leaf node 
    public TreeNode(E nodeData) { 
     data = nodeData; 
     leftNode = rightNode = null; // node has no children 
    } // end TreeNode constructor 

    // locate insertion point and insert new node; ignore duplicate values 
    public void insert(E insertValue) { 
     // insert in left subtree 
     if (data.compareTo(insertValue) > 0) { 
      // insert new TreeNode 
      if (leftNode == null) 
       leftNode = new TreeNode<E>(insertValue); 
      else // continue traversing left subtree 
       leftNode.insert(insertValue); 
     } // end if 
     else if (data.compareTo(insertValue) < 0) // insert in right subtree 
     { 
      // insert new TreeNode 
      if (rightNode == null) 
       rightNode = new TreeNode<E>(insertValue); 
      else // continue traversing right subtree 
       rightNode.insert(insertValue); 
     } // end else if 
    } // end method insert 
} // end class TreeNode 

您還需要爲樹中的類定義更改爲

public class Tree<E extends Comparable<E>> { 
0

主要錯誤是:

public void <E extends Comparable<TreeNode<E>>> insert(E insertValue) 

它定義了一個新的通用參數E僅適用於該方法。它應該是純粹:

public void insert(E insertValue) 

然後:

Tree<Integer> tree = new Tree<>(); 

提供一個實際的泛型類型參數樹。


BTW短一點(少new S)是:

樹:

public void insertNode(E insertValue) 
{ 
    root = insert(root, insertValue); 
} 

樹節點:

public static TreeNode<E> insert(TreeNode<E> node, E insertValue) 
{ 
    if (node == null) 
    { 
     return new TreeNode<E>(insertValue); 
    } 
    if (data.compareTo(insertValue) > 0) 
    { 
     node.leftNode = insert(node.leftNode, insertValue); 
    } 
    else if (data.compareTo(insertValue) < 0) 
    { 
     node.rightNode = insert(node.rightNode, insertValue); 
    } 
    return node; 
}