2016-10-23 8 views
0

式ツリーを作成してツリーのプロパティを使用して評価できるようにしたいと思います。しかし、私は表現木の作成からどこから始めるべきか分かりません。具体的には、私は、ツリー内の変数の2種類を持っている方法を考え出す困難が生じています:(数字のために)式ツリーの作成

  • ダブル(事業者用)
  • 文字

を私はこれを持っていますLinkedBinaryTreeクラス:この上

public class LinkedBinaryTree<E> extends AbstractBinaryTree<E>{ 
protected static class Node<E> implements Position<E> { 
    private E element; // an element stored at this node 
    private Node<E> parent; // a reference to the parent node (if any) 
    private Node<E> left; // a reference to the left child (if any) 
    private Node<E> right; // a reference to the right child (if any) 

    public Node(E e, Node<E> above, Node<E> leftChild, Node<E> rightChild) { 
     element = e; 
     parent = above; 
     left = leftChild; 
     right = rightChild; 
    } 
    // accessor methods 
    public E getElement() { return element; } 
    public Node<E> getParent() { return parent; } 
    public Node<E> getLeft() { return left; } 
    public Node<E> getRight() { return right; } 
    // update methods 
    public void setElement(E e) { element = e; } 
    public void setParent(Node<E> parentNode) { parent = parentNode; } 
    public void setLeft(Node<E> leftChild) { left = leftChild; } 
    public void setRight(Node<E> rightChild) { right = rightChild; } 
} //----------- end of nested Node class ----------- 


protected Node<E> createNode(E e, Node<E> parent, 
     Node<E> left, Node<E> right) { 
    return new Node<E>(e, parent, left, right); 
} 

// LinkedBinaryTree instance variables 
protected Node<E> root = null; // root of the tree 
private int size = 0; // number of nodes in the tree 

// constructor 
public LinkedBinaryTree() { } // constructs an empty binary tree 

// nonpublic utility 

protected Node<E> validate(Position<E> p) throws IllegalArgumentException { 
    if (!(p instanceof Node)) 
     throw new IllegalArgumentException("Not valid position type"); 
    Node<E> node = (Node<E>) p; // safe cast 
    if (node.getParent() == node) // our convention for defunct node 
     throw new IllegalArgumentException("p is no longer in the tree"); 
    return node; 
} 

// accessor methods (not already implemented in AbstractBinaryTree) 

public int size() { 
    return size; 
} 


public Position<E> root() { 
    return root; 
} 


public Position<E> parent(Position<E> p) throws IllegalArgumentException { 
    Node<E> node = validate(p); 
    return node.getParent(); 
} 


public Position<E> left(Position<E> p) throws IllegalArgumentException { 
    Node<E> node = validate(p); 
    return node.getLeft(); 
} 


public Position<E> right(Position<E> p) throws IllegalArgumentException { 
    Node<E> node = validate(p); 
    return node.getRight(); 
} 

public Position<E> addRoot(E e) throws IllegalStateException { 
    if (!isEmpty()) throw new IllegalStateException("Tree is not empty"); 
    root = createNode(e, null, null, null); 
    size = 1; 
    return root; 
} 


public Position<E> addLeft(Position<E> p, E e) 
     throws IllegalArgumentException { 
    Node<E> parent = validate(p); 
    if (parent.getLeft() != null) 
     throw new IllegalArgumentException("p already has a left child"); 
    Node<E> child = createNode(e, parent, null, null); 
    parent.setLeft(child); 
    size++; 
    return child; 
} 

public Position<E> addRight(Position<E> p, E e) 
     throws IllegalArgumentException { 
    Node<E> parent = validate(p); 
    if (parent.getRight() != null) 
     throw new IllegalArgumentException("p already has a right child"); 
    Node<E> child = createNode(e, parent, null, null); 
    parent.setRight(child); 
    size++; 
    return child; 
} 


public E set(Position<E> p, E e) throws IllegalArgumentException { 
    Node<E> node = validate(p); 
    E temp = node.getElement(); 
    node.setElement(e); 
    return temp; 
} 

public void attach(Position<E> p, LinkedBinaryTree<E> t1, 
     LinkedBinaryTree<E> t2) throws IllegalArgumentException { 
    Node<E> node = validate(p); 
    if (isInternal(p)) throw new IllegalArgumentException("p must be a leaf"); 
    size += t1.size() + t2.size(); 
    if (!t1.isEmpty()) { // attach t1 as left subtree of node 
     t1.root.setParent(node); 
     node.setLeft(t1.root); 
     t1.root = null; 
     t1.size = 0; 
    } 
    if (!t2.isEmpty()) { // attach t2 as right subtree of node 
     t2.root.setParent(node); 
     node.setRight(t2.root); 
     t2.root = null; 
     t2.size = 0; 
    } 
} 

public E remove(Position<E> p) throws IllegalArgumentException { 
    Node<E> node = validate(p); 
    if (numChildren(p) == 2) 
     throw new IllegalArgumentException("p has two children"); 
    Node<E> child = (node.getLeft() != null ? node.getLeft() : node.getRight()); 
    if (child != null) 
     child.setParent(node.getParent()); // child’s grandparent becomes its parent 
    if (node == root) 
     root = child; // child becomes root 
    else { 
     Node<E> parent = node.getParent(); 
     if (node == parent.getLeft()) 
      parent.setLeft(child); 
     else 
      parent.setRight(child); 
    } 
    size--; 
    E temp = node.getElement(); 
    node.setElement(null); // help garbage collection 
    node.setLeft(null); 
    node.setRight(null); 
    node.setParent(node); // our convention for defunct node 
    return temp; 
} 

public String toString(){ 
    String treeString = "("; 
    if(root != null){ 
     treeString += nodeString(root); 
    } 

    return treeString+")"; 
} 

private String nodeString(Node<E> node){ 
    String str = nodeToString(node); 
    if(node.getLeft()!=null){ 
     str += "("+ nodeString(node.getLeft()) + ")"; 
    } 

    if(node.getRight()!=null){ 
     str += "("+ nodeString(node.getRight()) + ")"; 
    } 

    return str; 
} 

private String nodeToString(Node<E> node){ 
    return "" + node.getElement(); 
} 

public static void main(String[] args) { 
    LinkedBinaryTree<Integer> tree = new LinkedBinaryTree<Integer>(); 
    Position<Integer> p; 
    Position<Integer> p1; 
    Position<Integer> p2; 
    p = tree.addRoot(5); 
    p1 = tree.addLeft(p, 3); 
    p2 = tree.addRight(p, 7); 
    tree.addLeft(p1, 1); 
    tree.addRight(p1, 4); 
    tree.addLeft(p2, 6); 
    tree.addRight(p2, 9); 
    System.out.println(tree.toString()); 
} 
} 

任意の助けをいただければ幸いです、ありがとう。

+0

式ツリーの各ノードは異なる場合があります。 「値」ノードは「ダブル」を含むことができる。 「バイナリ操作」ノードは、演算子と、表現の「左」と「右」側の2つのノード参照を含むことができる。あるいは、すべてのタイプの操作は、異なるタイプのノードです。 「単項演算」型のノードを持つこともできます。 「否定」( '-')、「not」('! ')、' sin() 'など – Andreas

答えて

0

問題は、同じジェネリックタイプEをツリークラス内のすべての場所に使用していることです。 異なるツリーの種類のノードが必要であるという事実を考えれば、それは意味をなさないでしょう。

または別の視点から:あなたの問題は、文字とダブルで動作するEが存在しないことです。

残念ながら、コードの大部分を再処理する必要があるかもしれません。 これを行うにははどうすればいいですか?今すぐ申し出ることができますが、thisgeeksforgeeksや​​のようないくつかのスニペットなど、多くの出発点があります。

0

文字列ツリーを使用して、文字列と文字列を文字列として保存することができます。しかし、私はこのソリューションを気に入っていません。文字列をdouble/charsにキャストしなければならないので、いつでもそれを数値や演算子であると知る必要があります。

私はクラスExpressionを作成し、ツリーには式LinkedBinaryTree<Expression>のオブジェクトが含まれています。次に、クラスにExpressionを継承させることができます。数字class NumberExpression extends Expressionとクラスclass OperatorExpression extends Expressionのクラスを作成できます。 foolowupはあなたがツリーを使いたいものに依存します。