2015-05-09 1 views
1

Я пытаюсь использовать абстрактное синтаксическое дерево, чтобы принять уравнение обратной польской позиции и изменить его на эквивалентную форму инфикса. Ниже приведена структура AST и print_table, которые мы первоначально использовали для печати дерева.Печать абстрактного дерева синтаксиса

struct tnode { 
    char *datum; 
    struct tnode *left; 
    struct tnode *right; 
}; 

void print_table(struct tnode *AST) { 
    if(AST != NULL) { 
    print_table(AST->left); 
    printf("%s", AST->datum); 
    print_table(AST->right); 
    } 
} 

Однако это печатает дерево сверху вниз. Например, если задано 5 4 + 3 -, оно вернет -3+45. Я хочу, чтобы он печатался: 5+4-3, по существу печатающий левое большинство дочерних элементов, затем это родительский узел и правый дочерний элемент этого родительского узла, пока не будут напечатаны все элементы дерева. Как я могу это сделать?

+1

Как '5 4 + 3 -' хранится в' tnode'? –

+2

Корень дерева - это -, левый ребенок которого равен +, правый ребенок равен 3. Левое дочернее число + - это 5, правый ребенок - 4. –

+7

Эта функция печати отображается правильно , Я буду держать пари, что ваша функция синтаксического анализа неверна. Ракетная версия вашего кода работает: http://pasterack.org/pastes/29421 –

ответ

0
struct tnode* 
build_tree(struct snode **S) 
{ 
    struct tnode* root; 
    if (*S == NULL) 
    return NULL; 

    char *top = peek(*S); 

    if (is_operator(top)) 
    { 
     root = create_node(top); 
     pop(S); 
     root->right = build_tree(S); 
     pop(S); 
     root->left = build_tree(S); 
     return root; 
    } 

    root = create_node(top); 

    return root; 
} 

Я думаю, что ваша проблема в том, как вы строите свое дерево. Функция печати должна работать для вас. Вот способ построения дерева. Я в твоем классе. Если вы хотите встретиться и совместно работать над проектом, я не буду.