Печать дерева выражений - PullRequest
       16

Печать дерева выражений

1 голос
/ 20 октября 2011

Я могу напечатать свое дерево выражений в порядке.Но я должен быть в состоянии напечатать это в порядке с круглыми скобками.например, порядок заказа 53+ должен вывести (5 + 3)

В настоящее время у меня есть:

void printTree(struct TreeNode *tree)
{
   if (tree != NULL)
    {
      if (isalpha(tree->info) || isdigit(tree->info))
        cout << "(";
      printTree( tree->left);
      cout<< tree->info;
      printTree(tree->right);
      if (isalpha(tree->info) || isdigit(tree->info))
        cout << ")";
    }
}

Но это дает мне неправильный вывод.Если я введу постфиксное выражение 62/5 +, это даст мне (6) / (2) + (5)

: (

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Необходимо различать листовые узлы и неконечные узлы. Только неконечные узлы заключены в парантезы.

bool isLeaf(struct TreeNode* tree) {
    return tree->left == 0 && tree->right == 0;
}

void printTree(struct TreeNode* tree) {
    if (tree != NULL) { // this test could be omitted if the printed tree is not empty
        if (isLeaf(tree)) {
            cout << tree->info;
        }
        else {
            cout << "(";
            printTree(tree->left);
            cout << tree->info;
            printTree(tree->right);
            cout << ")";            
        }
    }
}
1 голос
/ 20 октября 2011

Попробуйте изменить условия if, определяющие, следует ли печатать скобки:

void printTree(struct TreeNode *tree)
{
    if (tree != NULL)
    {
        if (!(isalpha(tree->info) || isdigit(tree->info)))
            cout << "(";
        printTree( tree->left);
        cout<< tree->info;
        printTree(tree->right);
        if (!(isalpha(tree->info) || isdigit(tree->info)))
            cout << ")";
    }
}

Или, возможно, даже лучше:

void printTree(struct TreeNode *tree)
{
    if (tree != NULL)
    {
        if (isoperator(tree->info))
            cout << "(";
        printTree( tree->left);
        cout<< tree->info;
        printTree(tree->right);
        if (isoperator(tree->info))
            cout << ")";
    }
}

, где isoperator определено соответствующим образомотличить операторы от операндов.

...