2015-06-22 3 views
0

описание Я не знаю, как выполнить эту задачу .... но я только что создал дерево и введите значение. Кто-нибудь может помочь мне выполнить эту задачу ... Stack также имеет тип узла и мы должны подтолкнуть значение операторов, таких как ab +, поэтому мы будем нажимать как узел, а затем b как узел, и когда + придет, мы создадим дерево, а a и b будет его узлом листьев.Напишите программу, которая преобразует выражение a b + c d e + * * в дерево выражений, используя стек.

.Code

#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

Для примера, который вы указали, каков ожидаемый результат? –

ответ

1

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

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

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

+ 
/\ 
    a b 

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

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