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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2013, 17:24   #1
Stanislav94
 
Регистрация: 27.02.2013
Сообщений: 3
Печаль Не могу понять что не так(бинарное дерево)

Кто может скажите почему при вставке 2ого элемента происходит отладка
Вот последовательность чисел в потоке(на 543 уже не работает):
34 543 23 43 56 7645 7434 355 54 4

Код:
#include <iostream>
#include <fstream>
using namespace std;
 
class BinaryTree
{
protected:
struct Tree
    {
    long Value;
    Tree *lSon;
    Tree *rSon;
    Tree(const long &Val, Tree *LSon=NULL, Tree *RSon=NULL)
        {
        Value=Val;
        lSon=LSon;
        rSon=RSon;
        }
    };
Tree *root;
public:
void Insert(const long &newvalue);
BinaryTree() {root=NULL;}           // Create empty tree
BinaryTree(const long &Value) {root=new Tree(Value);}
~BinaryTree() {};
};
 
void BinaryTree::Insert(const long &newvalue)
{
if (root==NULL)
    {
    root=new Tree(newvalue);
    return ;
    }
Tree * node=root;
while (node!=NULL);
    {
    if ((node->Value)>=newvalue)
        { node=node->rSon; }
    else 
        {
        if ((node->Value)<newvalue)
            { node=node->lSon; }
        }
    }
node=new Tree(newvalue);
return ;
}
 
int main ()
{
BinaryTree a;
ifstream f1("input.txt");
ofstream s2("output.txt");
int i;
while (!f1.eof())
    {
    f1>>i;
    a.Insert(i);
    }
return 0;
}
Stanislav94 вне форума Ответить с цитированием
Старый 03.03.2013, 17:33   #2
Stanislav94
 
Регистрация: 27.02.2013
Сообщений: 3
По умолчанию

Принимаю критику кода в любой форме
Stanislav94 вне форума Ответить с цитированием
Старый 03.03.2013, 18:20   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

При беглом взгляде на код: Вы не "подвешиваете" новый узел в дерево. Вы доходите до низа дерева, а затем указатель на node становится NULL, т.е. мы оказались за пределами дерева. Вам нужно хранить также указатель на отца узла, т.е. спуск осуществляется пока по рассматриваемому направлению не встретим NULL, при этом нужно создать узел и привесить к отцу.

Кстати, if тоже лишний - если значение не больше или равно, то оно точно меньше.

Вот такой способ увидел на хабре (только нужно на с++ переписать):
Код:
 current = @root
  while(true)
    if new_value >= current.value
      if current.right == nil
        current.right = Node.new(new_value)
        break
      else
        current = current.right
      end
    else
      if current.left == nil
        current.left = Node.new(new_value)
        break
      else
        current = current.left
      end
    end
  end
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 03.03.2013 в 18:24.
BDA вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять,что в программе не так,язык Си Alina111 Общие вопросы C/C++ 6 19.01.2013 21:00
не могу понять что не так aferistz Общие вопросы C/C++ 5 23.09.2010 02:21
строки и файлы не могу понять,что не так((((( marina_sergina Общие вопросы C/C++ 4 11.05.2010 07:49
строки и файлы не могу понять,что не так(((( marina_sergina Помощь студентам 1 11.05.2010 00:38
IBExpert, не могу понять что делаю не так! в чём проблема.... katia0017 SQL, базы данных 10 15.01.2010 18:33