Напишите программу, которая преобразует выражение a b + c d e + * * в дерево выражений, используя стек.

описание
Я не знаю, как выполнить эту задачу …. но я только что создал дерево и введите значение. Может кто-нибудь, пожалуйста, помогите мне выполнить эту задачу … Стек также имеет тип узла, и мы должны увеличить значение таких операторов, как ab +, поэтому мы будем выдвигать узел as, затем b как узел, а когда придет +, мы создаем дерево, а a и b будут его узлом листьев.

.Код

#include<iostream>

using namespace std;

class Node{
public:
int data;
Node *left;
Node *right;
Node()
{
data = 0;
left = NULL;
right = NULL;
}
};

class Tree
{
Node *root;
void insert(int d, Node *node)
{
if (d < node->data)
{
if (node->left == NULL)
{
Node *leaf = new Node();
leaf->data = d;
node->left = leaf;
}
else
{
insert(d, node->left);
}
}
else
{
if (node->right == NULL)
{
Node *leaf = new Node();
leaf->data = d;
node->right = leaf;
}
else
{
insert(d, node->right);
}

}
}

void inOrderDisplay(Node *subRoot)
{

if (subRoot != NULL)
{
inOrderDisplay(subRoot->left);
cout << subRoot->data << "  ";
inOrderDisplay(subRoot->right);
}
}

void postOrderDisplay(Node *subRoot)
{

if (subRoot != NULL)
{
postOrderDisplay(subRoot->left);
postOrderDisplay(subRoot->right);
cout << subRoot->data << "  ";
}
}

void preOrderDisplay(Node *subRoot)
{

if (subRoot != NULL)
{
cout << subRoot->data << "  ";
preOrderDisplay(subRoot->left);
preOrderDisplay(subRoot->right);

}
}

void deleteSubtree(Node *subRoot)
{
if (subRoot != NULL)
{
deleteSubtree(subRoot->left);
deleteSubtree(subRoot->right);
cout << "\ndeleting: " << subRoot->data;
delete subRoot;
subRoot = NULL;
}
}

public:
Tree()
{
root = NULL;
}
~Tree()
{
deleteAll();
}

void insert(int d)
{
if (root == NULL)
{
Node *leaf = new Node();
leaf->data = d;
root = leaf;
}
else
{
insert(d, root);
}
}

void inOrderDisplay()
{
inOrderDisplay(root);

}

void postOrderDisplay()
{
postOrderDisplay(root);

}

void preOrderDisplay()
{
preOrderDisplay(root);

}
void deleteAll()
{
deleteSubtree(root);
}

};

.Основной класс:

#include<iostream>
#include"task1.h"using namespace std;

void main()
{
Tree tree;

tree.insert(10);
tree.insert(6);
tree.insert(14);
tree.insert(5);
tree.insert(8);
tree.insert(11);
tree.insert(18);
cout << endl;
system("pause");
//tree.deleteAll();
}

0

Решение

Основываясь на коде у вас здесь, у вас есть только void insert(int d, Node *node) функции нет void insert(operator o, Node *node) функция.

Я думаю, это показывает, что вы упустили важный момент здесь. Каждый узел в дереве может быть целым числом (как и вы) или оператор. В обоих случаях я бы назвал это строкой. Каждый узел, который не является листом, должен быть оператором, и все листы должны быть целыми числами (или строками, которые представляют операторы / целые числа в нашем случае).

Затем, перебирая ввод, первые три элемента должны привести к чему-то вроде:

    +
/ \
a   b

Следующим шагом будет создание дополнительных поддеревьев (не уверенных в определении входных данных, которые у вас есть), сохранение их в вашем стеке, а затем создание большего количества внутренних узлов дерева.

Так что, если дерево, которое я показал выше, называется Tree(+) (для простоты использования), и начальный стек был [a,b,+,c,d,e,*,*]то после одной итерации вы получите [Tree(+),c,d,e,*,*] и вы продолжаете оттуда.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector