2012-02-03 18 views
6

Czy ktoś mógłby wyjaśnić, jak zbudować binarne drzewo wyrażeń.Buduj drzewo binarnej ekspresji

Na przykład mam ciąg 2*(1+(2*1)); Jak przekonwertować to na binarne drzewo wyrażeń.

* 
| \ 
| \ 
2 + 
    |\ 
    1 * 
     |\ 
     2 1 
+0

Można wdrożyć rozwiązanie za pomocą algorytmu manewrowego. Oto kilka szczegółów na wikipiedii: . Ten algo został wymyślony przez Edsger Dijkstra, jest to bardzo fajna alternatywa.Jeśli potrzebujesz trochę szczegółów, mogę napisać przykład kodu, który napisałem w C# jakiś czas temu, ale przypuszczam, że link wikipedia jest więcej niż wystarczający. –

Odpowiedz

2

trzeba będzie:

  1. zdefiniować gramatyki, która opisuje język
  2. napisać leksykalne analizatora, który odczytuje znaki z łańcucha
  3. zapisu parser budujący drzewo z tokenów

na przykład spojrzeć na tego podejścia: http://en.wikipedia.org/wiki/Recursive_descent_parser

istnieją inne

+2

Prawdopodobnie jest to przesada, ponieważ jest to dość proste zadanie do wizualnego przedstawienia sposobu analizowania wyrażeń. –

9

Konwersja infix do postfix lub przedrostek

Wejście Postfix: ab + CDE + **

  1. Rozważ pierwszy znak, jeśli nie jest symbolem, a następnie utwórz węzeł dodaj do stosu
  2. Jeśli chara cter to symbol, a następnie utwórz węzeł z symbolami popowymi elementami i dodaj do lewej i prawej strony symbolu
  3. Wciśnij symbol węzła na stosie.
  4. Powtórz 1, 2 i 3 do iteratora nie ma więcej elementów Wdrożenie

Java

public Tree.TreeNode createExpressionTree(){ 
    Iterator<Character>itr = postOrder.iterator(); 
    Tree tree = new Tree(); 
    NodeStack nodeStack = new NodeStack(); 
    Tree.TreeNode node; 
    while (itr.hasNext()) { 
     Character c = itr.next(); 
     if(!isDigit(c)){ 
      node = tree.createNode(c); 
      node.right = nodeStack.pop(); 
      node.left = nodeStack.pop(); 
      nodeStack.push(node); 
     }else{ 
      node = tree.creteNode(c); 
      nodeStack.push(node); 
     } 
    } 
    node = nodeStack.pop(); 
    return node; 
} 

Więcej informacji: http://en.wikipedia.org/wiki/Binary_expression_tree

+1

Tutaj symbol = operator –

0

To może być podzielony na dwa etapy:

  1. Obliczyć priorytet dla każdego tokena.

    Na przykład: '+': 1, 'x',: 2, liczba INF, '(': dodanie 10 do podstawy, ')': odjąć 10 od podstawy)

  2. budowy Cartesian tree oparciu priorytet przy użyciu stosu (około 5 linii kodu)

Możesz to zrobić w jednym skanie.