2010-11-11 2 views
2

У меня есть два стека, один с операндами, другой с операторами. Моя проблема превращает эти два стека в двоичное дерево.Создать рекурсивное двоичное дерево?

Например, выражение (2+3)*(4-3) будет переведен на постфикса (таким образом, что 24+43-*), а затем положить на два стека 3442 и *-+ будет стеки (с вершины быть 3 и * соответственно).

Теперь с этими стеками, мне нужно, чтобы сформировать бинарное дерево как

* 
+ - 
2 3 4 3 

Есть ли способ сделать это рекурсивно?

Прямо сейчас, у меня есть алгоритм, например, так:

  • Создать корень дерева, присвоить значение корня до первого оператора в операторе стека. Установите правый и левый указатели на нуль.

  • Создайте правый узел, назначьте значение следующего оператора, если он существует, если не назначить ему операнд. Затем сделайте то же самое для левого узла.

Моя проблема заключается в том, чтобы сделать это рекурсивным или заставить его обрабатывать множество разных случаев.

Благодарим за помощь.

+0

Вы немного перепутали количество стека.Ответ от Let_Me_Be ниже выглядит хорошо, вам нужно больше деталей? –

+0

более подробно было бы хорошо. в частности, я могу найти самого высокого оператора, но я не уверен, как разделить выражение или «применить на обеих частях». – Blackbinary

+0

Ваш метод кажется ошибочным: для этого требуется, чтобы на каждой стороне оператора было одинаковое количество операндов и операторов. используя это выражение '(2 + 3) -4', получается стек, идентичный' 2+ (3-4) '. –

ответ

1

Рекурсивный алгоритм:

  • найти наивысший приоритет оператора
  • разделить выражение вокруг этого оператора
  • рекурсивно применить на обеих частях
+1

применить этот метод со стеком '24 + 43 * -' (что соответствует' (2 + 4) - (4 * 3) ') и увидеть результат ... –

+0

Смотрите мой комментарий выше, я бы хотел некоторые дополнительные подробности. Благодарю. – Blackbinary

+0

@Adrien Я пропустил постфиксную часть. Этот алгоритм предназначен для инфиксного формата. –

2

если у вас есть только бинарные операторы

treeNode createNode(operators, operands) { 
    // take first operator and create a new treeNode with it. pop it from the operators stack 

    // if it is the last operator in the list then there should be only two operands left in the operands and you can assign them to the left and right child of the treeNode. return this treeNode. 

    // if it is not the last operator then split the operands in two stacks equally 
    // leftOperands and rightOperands 
    // left child becomes createNode(operators, leftoperands) 
    // right child becomes createNode(operators, rightoperands) 
    // return this treeNode 

} 
+0

Я не уверен, как разбить мой стек операндов. Я предполагаю, что мне нужно будет найти # операндов каким-то образом? Что, если его странное, не имеет значения, что получает больше операндов? – Blackbinary

+0

Я предполагал, что у вас есть только двоичные операторы, поэтому у вас будет сила из двух операндов. Я не уверен, что мой алгоритм будет работать. Вы должны увидеть, как я бы подошел к этой проблеме, она может содержать лазейки. Успех! – Jan

+0

Ах, это правильно, забыл, что в этом случае не может быть странным. Спасибо, я попробую. – Blackbinary

0

, если ваше выражение всегда симметрично (то же число операндов и операторов на каждой стороне оператора), то метод вы описываете отлично работает, с небольшим изменением:

  1. создать узел, присвоить значение верхнего оператора в стеке оператора.
  2. Если в стеке оператора нет оператора, поместите два операнда из стека операндов и назначьте их левой и правой ветви, затем завершите
  3. , если в стеке есть какой-либо оператор, идите влево откройте свой узел и вызовите свой алгоритм, затем перейдите в нужную ветку и вызовите свой алгоритм.

(Ян объяснил это так гораздо понятнее в своем ответе ...)

+0

Я собираюсь предположить, что он всегда симметричен. Я попробую ваш подход. Спасибо за помощь. – Blackbinary

0

В целом не существует способ сделать это. «1 2 3 4» «* + /» означает «1 2 3 4 * + /» (то есть «1/(2 + 3 * 4)») или «1 2 * 3 + 4 /», (то есть "(1 * 2 + 3)/4").

Смежные вопросы