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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2018, 01:33   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Итеративный вариант функции - C++

Здравствуйте. Есть бинарное дерево с функциями вставки,вывода и удаления элемента. Нужно сделать итеративный вариант функции вставки элемента в дерево.
Код:
struct node
{
    int key;
    char *word;
    struct node *left, *right;
};
  
 
struct node *newNode(char *item,int k)
{
    struct node *temp = new node[sizeof(struct node)];
    temp->key=k;
    temp->word= new char(strlen(item)+1);
    strcpy( temp->word,item);
    temp->left = temp->right = NULL;
    return temp;
}
  struct node* insert(struct node* node, char *item,int key) 
{
   cout<<"Insert:"<<endl;
 
    if (node == NULL)
        return newNode(item,key);
 
 
    if (key <= node->key)
    {
        
        node->left  = insert(node->left,item, key);
    }
    else if (key > node->key)
    {
    
        node->right = insert(node->right,item, key);   
    }
 
    return node;
}
Мой вариант итеративной функции вставки элемента в дерево не дает результат, дерево остается пустым
Код:
struct node* insertIteration(struct node* node, char *item,int key) 
{
        while(node)
        {
            if (node == NULL)
                return newNode(item,key);
           if (key < node->key)
            {
                    node=node->left;
            }
            else if (key > node->key)
            {
                    node=node->right;
             }
        }
 
    return node;
}
Код:
int main()
{
struct node *root = NULL;
    root = insertIteration(root,"солнце",0);
    insertIteration(root, "светит",1);
    insertIteration(root, "ярко",2);
}
Подскажите,пожалуйста, в чем ошибка итеративной функции?
Вероника99 вне форума Ответить с цитированием
Старый 07.06.2018, 06:54   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Ошибка простая: нет смысла проверять ифом ноду на нулл после того как проверили вайлом.
p51x вне форума Ответить с цитированием
Старый 07.06.2018, 15:58   #3
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Поменяла кое-что, теперь только первое слово вставляется.
Код:
struct node* insertIteration(struct node* node, char *item,int key) 
{
 
    if (node == NULL)
                {
                    node=newNode(item,key);
                    return node;
                }
        
            
           if (key < node->key)
            {
                while(node->left!=NULL)
                    node=node->left;
                
            }
            else if (key > node->key)
            {
                while(node->right!=NULL)
                    node=node->right;
                
             }
        
 
    return node;
}
Вероника99 вне форума Ответить с цитированием
Старый 07.06.2018, 16:02   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Ну так вы сами ретурн написали.
p51x вне форума Ответить с цитированием
Старый 07.06.2018, 16:10   #5
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

С return или без, все равно только первое слово заносится
Код:

	if (node == NULL)
                {
                    node=newNode(item,key);
                    //return node;
                }
        
            
           if (key < node->key)
            {
                while(node->left!=NULL)
                    node=node->left;
                
            }
            else if (key > node->key)
            {
                while(node->right!=NULL)
                    node=node->right;
                
             }
        return node;
Вероника99 вне форума Ответить с цитированием
Старый 07.06.2018, 16:20   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Ну вы свой код читаете? У вас в циклах указатель на ноду только сдвигается. Где после этого вставки? Да и вот так затирать указатель не дело...
p51x вне форума Ответить с цитированием
Старый 07.06.2018, 16:31   #7
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Так я тоже уже пробовала
Код:
	if (node == NULL)
                {
                    node=newNode(item,key);
                    //return node;
                }
        
            
           if (key < node->key)
            {
                while(node->left!=NULL)
                    node=node->left;
                	if (node == NULL)
                {
                    node=newNode(item,key);
                    //return node;
                }
        
            }
            else if (key > node->key)
            {
                while(node->right!=NULL)
                    node=node->right;
                	if (node == NULL)
                {
                    node=newNode(item,key);
                    //return node;
                }
        
             }
    return node;
Вероника99 вне форума Ответить с цитированием
Старый 07.06.2018, 16:47   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Да не надо пробовать. Надо сесть и просто написать алгоритм на школьном алгоритмическом, например. Так и писать:
если дерево пустое, то...
если дерево не пустое, то...
и сразу будет понятно
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарные деревья. Итеративный алгоритм обработки now2 Паскаль, Turbo Pascal, PascalABC.NET 6 16.10.2014 07:28
Итеративный алгоритм okarus Помощь студентам 0 22.11.2011 20:26
итеративный поиск в глубину Anastasia.K Помощь студентам 1 23.10.2011 09:21
Ассемблер вариант № 2 arb1337 Помощь студентам 2 27.09.2011 10:42