Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2010, 09:33   #11
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

кто выдает ошибку? компилятор или прога во время выполнения?

если компилятор, то в студию описание ошибки и строку, где она вызвалась
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 19.11.2010, 09:46   #12
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

я тока ща твой код еще раз мосмотрел - а кто родителей будет заполнять??? я что ле??? поле parent, указатели, не тупите на ровном месте
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 19.11.2010, 09:53   #13
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Код:
#include <iostream>

using namespace std;

struct elem{
  char value;
  elem* left;
  elem* right;
  elem* parent;
  };

void prohod(elem *tmp, elem *root) {
  elem *t = tmp;
  while (t != root) {
    if (t) {
      cout << t->value << " - ";
      t = t->parent;
    }
  }
  cout << root->value;
}

int main(int argc, char* argv[]){
  elem* root = new elem;
  root->value = 'E';

  root->parent = NULL;

  root->left = new elem;
  root->right = new elem;

  root->left->parent = root;
  root->right->parent = root;

  root->left->value = 'B';
  root->right->value = 'G';
  root->right->left =new elem;
  root->right->right =new elem;
  root->left->left =new elem;
  root->left->right =new elem;

  root->right->left->parent = root->right;
  root->right->right->parent = root->right;
  root->left->left->parent = root->left;
  root->left->right->parent = root->left;



  root->right->left->value ='F';
  root->right->right->value ='H';
  root->left->left->value ='A';
  root->left->right->value ='C';
  elem* tmp = root->left->right;
  prohod(tmp,root);

  cout << endl << endl << "Press any key for exit...";
  _flushall();
  getchar();
  return 0;
}
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 19.11.2010, 10:28   #14
Skilluser
 
Регистрация: 17.11.2010
Сообщений: 7
По умолчанию

Спасибо! почти правильно работает! Единственное, что программа проходит только по ветке tmp... Выдает при запуске -"F-B-A", а должна "D-B-A, F-B-A, H-C-A, G-C-A" или просто, без конечных листов-"B-A,B-A, C-A,C-A"...
Как сделать, чтобы по всему дереву ходила?

Последний раз редактировалось Skilluser; 19.11.2010 в 13:30.
Skilluser вне форума Ответить с цитированием
Старый 20.11.2010, 17:19   #15
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
Единственное, что программа проходит только по ветке tmp
Цитата:
prohod(tmp,root);
а это что??? не по ветке tmp проходит, а от переданного указателя до корня дерева
соответственно эту процедуру тогда надо вызывать для каждого листа дерева
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 20.11.2010, 17:50   #16
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Жжоте, товарисчи. Parent и многократный вызов не нужны. И построение левое.
Код:
#include <iostream>
#include <vector>
#include <iterator>

struct Node {
  char value_;
  Node *left_;
  Node *right_;
  
  Node(char value): value_(value), left_(NULL), right_(NULL) { }
  Node(char value, Node *left, Node *right):
    value_(value), left_(left), right_(right) { }
};

std::vector<char> stack;

void solve(Node *root) {
  stack.push_back(root->value_);
  if (root->left_ == NULL && root->right_ == NULL) {
    std::copy(stack.rbegin(), stack.rend(),
              std::ostream_iterator<char>(std::cout, " "));
    std::cout << std::endl;
  } else {
    solve(root->left_);
    solve(root->right_);
  }
  stack.pop_back();
}

int main(int argc, char* argv[]){
  Node *e = new Node('E');
  Node *f = new Node('F');
  Node *c = new Node('C', e, f);
  Node *g = new Node('G');
  Node *h = new Node('H');
  Node *d = new Node('D', g, h);
  Node *b = new Node('B', c, d);
  Node *k = new Node('K');
  Node *n = new Node('N');
  Node *t = new Node('T', k, n);
  Node *a = new Node('A', b, t);

  solve(a);
  
  return 0;
}
still_alive вне форума Ответить с цитированием
Старый 20.11.2010, 19:03   #17
Skilluser
 
Регистрация: 17.11.2010
Сообщений: 7
По умолчанию

still alive, у меня препод будет смотреть эту программу и если увидит твой код, то поймет, что делал не я. может можно без parent с моим построением сделать?
RUSt88. я понял. спасибо!
Skilluser вне форума Ответить с цитированием
Старый 20.11.2010, 19:30   #18
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
Жжоте, товарисчи.
умничай в другом месте, если у самого ума палата размером со спичечную коробку

я здесь написал просто пример как пройтись по дереву от листа к корню, а построение дерева - это деяние рук автора поста, так что оставь свою унылую орфографию для быдла
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 20.11.2010, 19:34   #19
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
может можно без parent с моим построением сделать
с твоим построением можно только люлей огрести и в твоем случае я тебе предложил лучший вариант, тебе довести до ума (нужно просто в процедуру накидать указателей на листья, от к-рых нужно дойти до корня)

а лучше почитай книжек по алгоритмизации
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск по бинарному дереву интеграл Общие вопросы C/C++ 3 01.05.2010 11:52
С++. Отыскать проход по лабиринту Romer9999 Помощь студентам 1 17.06.2009 23:33
Проход по дереву. Ozerich Общие вопросы Delphi 1 05.10.2008 17:33
TreeView и PageControl (переключение вкладок по дереву) Nevy Общие вопросы C/C++ 5 17.08.2008 19:17