2012-02-03 5 views
6

Может ли кто-нибудь объяснить, как построить двоичное дерево выражений.Создание двоичного дерева выражений

Например, у меня есть строка 2*(1+(2*1)); Как преобразовать это в двоичное дерево выражений.

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

Вы можете реализовать решение, используя алгоритм шунтирования. Ниже приведены некоторые сведения о wikipiedia: . Этот алго был изобретен Эдсгером Дейкстра, это очень хорошая альтернатива.Если вам нужны детали, я могу опубликовать пример кода, который я написал на C# некоторое время назад, но я полагаю, что ссылка на wikipedia более чем достаточно. –

ответ

2

вам нужно:

  1. определить грамматику, которая описывает ваш язык
  2. написать лексический анализатор, который считывает маркеры из вашей строки
  3. записи парсер, который строит дерево из токенов

, например, взглянуть на этот подход: http://en.wikipedia.org/wiki/Recursive_descent_parser

есть другие

+2

Это, вероятно, слишком много для того, что является довольно простым назначением визуально показать, как анализируются выражения. –

9

Преобразовать инфикс к постфикса или префиксом

Входной постфикса является: аб + CDE + **

  1. Рассмотрим первый символ, если он не является символом, а затем создайте узел, чтобы добавить его в стек
  2. Если chara cter - это символ, затем создайте узел с символами поп-элементов и добавьте влево и вправо от символа
  3. Нажмите узел символа в стек.
  4. Repeat 1, 2 и 3 до итератора больше не имеет элементы реализации

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; 
} 

Подробнее: http://en.wikipedia.org/wiki/Binary_expression_tree

+1

Здесь символ = оператор –

0

Его можно разделить на два этапа:

  1. Рассчитать значение приоритета для каждого токена.

    Например: '+': 1, 'х': 2, номер: инф, '(': добавить 10 к основанию, ')': вычесть 10 из базы)

  2. Построить Cartesian tree на основе приоритет с использованием стека (приблизительно 5 строк кода)

Вы можете сделать это одним сканированием.

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