Построение дерева для префиксных выражений
def insert
Insert each token in the expression from left to right:
(0) If the tree is empty, the first token in the expression (must
be an operator) becomes the root
(1) Else if the last inserted token is an
operator, then insert the token as the left child of the last inserted
node.
(2) Else if the last inserted token is an operand, backtrack up the
tree starting from the last inserted node and find the first node with a NULL
right child, insert the token there. **Note**: don't insert into the last inserted
node.
end def
Давайте сделаем пример: + 2 + 1 1
Применить (0).
+
Применить (1).
+
/
2
Применить (2).
+
/ \
2 +
Применить (1).
+
/ \
2 +
/
1
Наконец, применить (2).
+
/ \
2 +
/ \
1 1
Этот алгоритм был протестирован на - * / 15 - 7 + 1 1 3 + 2 + 1 1
Так что реализация Tree.insert
- это три правила.
insert(rootNode, token)
//create new node with token
if (isLastTokenOperator)//case 1
//insert into last inserted's left child
else { //case 2
//backtrack: get node with NULL right child
//insert
}
//maintain state
lastInsertedNode = ?, isLastTokenOperator = ?
Оценка дерева немногозабавно, потому что вы должны начать с нижней правой части дерева.Выполните обратный пост-заказ обход.Сначала посетите правильного потомка.
evalPostorder(node)
if (node == null) then return 0
int rightVal = evalPostorder(node.right)
int leftVal = evalPostorder(node.left)
if(isOperator(node.value))
return rightVal <operator> leftVal
else
return node.value
Учитывая простоту построения дерева из префиксного выражения, я бы предложил использовать стандартный стековый алгоритм для преобразования из инфикса в префикс.На практике вы используете стековый алгоритм для оценки выражения инфикса.