2016-04-12 1 views
0

Я создал двоичное дерево выражения и имеет операторы (+, -, /, *) в качестве корней и операндов (значений) в качестве детей слева/справа. Мне нужно оценить это выражение в двоичном дереве, используя параметры (T, v), где «T» - двоичное дерево, а «v» - это узел, в котором начинается обход послепорядка.Оценка выражения в двоичном дереве Java

Я искал, как работает постобработка, и все, что я понимаю. Но я не знаю, как реализовать код, используя узел «v» для обхода послепорядка.

Мой метод выглядит следующим образом ...

public int evaluateExpression (LinkedBinaryTree<T> tree, Position<T> v) { 

} 

Это должен возвращать оператор используется на своих операторов (дети корня). Итак, я понимаю, что делать, я зациклен на том, как это сделать на самом деле. -.-

ответ

2

Вам не нужно предоставлять все дерево, и вам не нужен отдельный класс Position. Каждое поддерево - это дерево. Вам просто нужно что-то такого рода:

public class <T extends Number> ExpressionTree<T> { 
    private ExpressionTree<T> left, right; 
    private T value; 
    private int operator; 

    // constructors, getters, setters, etc. elided 

    public T evaluateExpression() { 
     // Here I am assuming a <T> value field that is set if the node 
     // is a literal value rather than an expression subtree with left and right children. 
     if (this.value != null) 
      return this.value; 
     // Evaluate the subtree 
     switch (this.operator) { 
     case '+': 
      return left.evaluateExpression()+right.evaluateExpression(); 
     // etc for the other operators 
     } 
    } 

Вы не должны использовать LinkedBinaryTree класс, упомянутый в комментариях ниже. Он никоим образом не предназначен для этой цели и кажется мне ненужным сложным даже для своей собственной цели.

+0

Хорошо, я понимаю, что вы делаете. Я хотел бы понять это немного больше. Когда вы используете tree.value и tree.operator, откуда вы получаете «значение» и «оператор»? –

+0

От узла дерева, который будет чем-то вроде 'class LinkedBinaryTree {LinkedBinaryTree left, right; int operator; Значение T; } '. – EJP

+0

@EJP поддерживает этот «хороший» API: http://net3.datastructures.net/doc5/net/datastructures/LinkedBinaryTree.html :) –

0

Обычно, в реальном мире, вы сделали бы это, как предлагает EJP.

Это сказано, postorder итератор даст вам значение и оператор, хранимые в дереве в правильном порядке, чтобы сделать в основном это:

  • Если элементом является числом, толкать его на ряде стек
  • Если элемент является операцией, поп два элемента из стека чисел, процесс их в соответствии с операцией и подтолкнуть результат

После обхода, возвращают единственный элемент в стеке

+0

Я не понимаю, почему вы использовали бы стек, если у вас уже есть дерево. – EJP

+0

Ну, исходный вопрос был о постоператоре, поэтому я только предположил, что это так, как им это нужно ... Я никоим образом не связан с книгой или API, и я разделяю ваше мнение по этому поводу - просто его «сожгли» раньше, пытаясь помочь здесь: http://stackoverflow.com/questions/36522929/building-a-binary-tree/36523591#36523591 –

+0

Я вижу, что вы там делаете. Я сделаю это, возможно, как последнее усилие. –