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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2011, 22:01   #1
murzilka6002
Пользователь
 
Регистрация: 11.11.2011
Сообщений: 20
Вопрос Ошибка в алгоритме поиска

Есть алгоритм поиска по дереву. Как бы всё работает только на первом узле (поиск в узле и его потомках), а дальше не идет.
Подскажите, в чем ошибка кода?


PHP код:
#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>

using namespace std;

//Class drzewa
class tree_node
       
{
       public:
        
int id;                                        //Numer
        
string data;                                   //zawartosc
        
vector <tree_nodechildren;                   //dzieci
        
};

//Funkcja wyszukiwania
void szukaj(tree_nodetstrings)
{
         if (
t.data==s)                                //Wyszuk
            
{
             
cout<<"id= "<< t.id<<"\t";                //Wywod wyszukiwania
            
}           
         for(
int i=0i<t.children.size();i++)         //Sprawdzanie wezla
                
{
                 
szukaj(t.children[i],s);
                }
}

        
int main(int argcchar *argv[])
{
    
tree_node root;
root.id=1;
root.data="Ivan";

tree_node node2;
node2.id=2;
node2.data="text";
root.children.push_back(node2);

tree_node node3;
node3.id=3;
node3.data="Andrzej";
root.children.push_back(node3);

tree_node node4;
node4.id=4;
node4.data="Swieta";
root.children.push_back(node4);

tree_node node5;
node5.id=5;
node5.data="Kolia";
root.children.push_back(node5);

tree_node node6;
node6.id=6;
node6.data="Mihal";
node2.children.push_back(node6);

tree_node node7;
node7.id=7;
node7.data="Ivan";
node2.children.push_back(node7);

tree_node node8;
node8.id=8;
node8.data="Tania";
node4.children.push_back(node8);

tree_node node9;
node9.id=9;
node9.data="Andrzej";
node4.children.push_back(node9);

tree_node node10;
node10.id=10;
node10.data="Olia";
node5.children.push_back(node10);

tree_node node11;
node11.id=11;
node11.data="Sasza";
node5.children.push_back(node5);

tree_node node12;
node12.id=12;
node12.data="Tania";
node5.children.push_back(node12);

tree_node node13;
node13.id=13;
node13.data="Kolia";
node7.children.push_back(node13);

tree_node node14;
node14.id=14;
node14.data="Tania";
node10.children.push_back(node14);

tree_node node15;
node15.id=15;
node15.data="Swieta";
node10.children.push_back(node15);

tree_node node16;
node16.id=16;
node16.data="Dawid";
node12.children.push_back(node16);

tree_node node17;
node17.id=17;
node17.data="Wiktor";
node12.children.push_back(node17);

tree_node node18;
node18.id=18;
node18.data="Ania";
node12.children.push_back(node18);


////////////////Wyszukiwanie//////////////////////////

string szuk;

cin>>szuk;
szukaj(root,szuk);
cout<<endl;

    
system("PAUSE");
    return 
EXIT_SUCCESS;

murzilka6002 вне форума Ответить с цитированием
Старый 23.11.2011, 22:50   #2
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

Алгоритм поиска корректный. А вот дерево вы строите неправильно.
сперва вы в root вставляете node2, и только после этого в node2 вставляете чилдренов. но само рутовое дерево от вставки в node2 уже не меняется.
_Ч_ вне форума Ответить с цитированием
Старый 23.11.2011, 23:20   #3
murzilka6002
Пользователь
 
Регистрация: 11.11.2011
Сообщений: 20
По умолчанию

Я не могу сразу добавлять потомков, так как их не задекларировал, а добавляю уже после. Да к тому же параметр children - это вектор, и к нему просто дописывается. И на первом уровне после root-а работает, а уже второй не видит.
Дерево вот так выглядит
Код:
root|___
    |	node2___
    |		node6
    |		node7___
    |___		node13
    |	node3
    |	node4___
    |		node8
    |___	node9
    	node5___
		node10__
			node14
		node11
		node12__
			node15
			node16
			node17
			node18
murzilka6002 вне форума Ответить с цитированием
Старый 23.11.2011, 23:27   #4
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

еще раз. дерево в коде строится неверно. вы хотите такое, которое привели, а на самом деле оно другое. когда вы вставляете в node2 нового чилдрена, он вставляется в узел node2. это не тот узел, который в рутовом дереве. в рутовом дереве копия node2. вам нужно получить указатель/ссылку на узел из рута и добавлять чилдренов используя этот указатель/ссылку.
_Ч_ вне форума Ответить с цитированием
Старый 23.11.2011, 23:30   #5
murzilka6002
Пользователь
 
Регистрация: 11.11.2011
Сообщений: 20
По умолчанию

А можешь показать пример, я понял...., но не понял как это реализовать.
murzilka6002 вне форума Ответить с цитированием
Старый 23.11.2011, 23:36   #6
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

ну например можно вот так:
Код:
tree_node node2;
node2.id=2;
node2.data="text";
root.children.push_back(node2);

// получаем ссылку на только что вставленный узел.
tree_node& node2Ref = root.children.back(); // получаем ссылку на только что вставленный узел.
// далее, работаем с этой ссылкой. вместо node2 используем node2Ref.

...
tree_node node6;
node6.id=6;
node6.data="Mihal";
node2Ref.children.push_back(node6);
...

// если потом нужно будет в node6 навставлять чайлдов, то аналонично
// получаем ссылку на этот node6 и точно также ее используем.
_Ч_ вне форума Ответить с цитированием
Старый 23.11.2011, 23:41   #7
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

кстати, тут нужно быть осторожным. из-за того, что заюзан вектор, могут быть проблемы при его росте. вектор может перевыделить большый кусок памяти и скопировать свое содержимое в новую память. в этом случае все ранее полученные ссылки на содержимое вектора станут невалидными. если заранее известено количество элементов в векторе, то поможет std::vector<>::reserve(n); иначе придется использовать другой контейнер. у узловых контейнеров такой проблемы нет. в случае если работаем только с указателями на внутренности (не итераторами), то пойдет std:eque<>
_Ч_ вне форума Ответить с цитированием
Старый 23.11.2011, 23:47   #8
murzilka6002
Пользователь
 
Регистрация: 11.11.2011
Сообщений: 20
По умолчанию

А объясни, пожалуйста, как работает eque<> что это?

Последний раз редактировалось murzilka6002; 23.11.2011 в 23:51.
murzilka6002 вне форума Ответить с цитированием
Старый 23.11.2011, 23:48   #9
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

код в студию.
_Ч_ вне форума Ответить с цитированием
Старый 23.11.2011, 23:59   #10
murzilka6002
Пользователь
 
Регистрация: 11.11.2011
Сообщений: 20
По умолчанию

PHP код:
tree_node node2;
node2.id=2;
node2.data="Dawid";
root.children.push_back(node2);
tree_nodenode2Ref root.children.back();

tree_node node6;
node6.id=6;
node6.data="Mihal";
node2Ref.children.push_back(node6); 
Ошибка памяти выбивает....это из-за вектора, что перезаполнен?

А как реализовать eque<> ?
murzilka6002 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в алгоритме слияние массивов ATAMAN200 Общие вопросы C/C++ 3 25.10.2010 20:37
Ошибка в алгоритме?Выдает ошибку после компиляции. Aerial Общие вопросы C/C++ 2 12.05.2010 16:52
Ошибка в алгоритме сортировки в теме "ДЛЯ СТУДЕНТОВ !!!" Darth.Vader Общие вопросы C/C++ 0 06.12.2009 15:21
Ошибка в алгоритме нахождения тройки чисел с максимальным произведением k1r1ch Паскаль, Turbo Pascal, PascalABC.NET 7 22.10.2009 22:30
Ошибка в алгоритме программы на бинарные фйлы ROD Общие вопросы C/C++ 0 15.04.2009 22:15