Изменения в дополнении C ++ BST

У меня есть этот простой вопрос. В основной функции я делаю: bsearch_tree bs1; Я объявляю в дереве BST. Затем я добавляю узлы к этому дереву. Затем я объявляю на другом дереве BST: bsearch_tree bs2; , и я добавляю в него несколько узлов (еще один).

То, что он делает, добавляет к truts bs1 и bs2 одни и те же узлы. Ибо, когда я печатаю оба дерева, я вижу, что они такие же, но их не должно быть. Это не правильно.

Я попытался отлаживать и обнаружил, что, добавляя узлы, он добавляет их в одно и то же дерево.

Мне как-то нужно сделать деревья отличными.

Думаю, мне нужно создать новый экземпляр класса bsearch_tree , но я не могу изменить главную функцию (ограничение).

Вот файл заголовка:

#include

using namespace std;

class tnode
{
private:
    double data;
    tnode *left;
    tnode *right;
public:
    tnode(double key);
    friend class bsearch_tree;
    friend void assist(tnode *tmp);
    friend ostream& operator<<(ostream& stream,tnode const *root);
};
class bsearch_tree
{
    tnode *root;
public:
    bsearch_tree();
    bsearch_tree(int);
    void duplicate_tree(tnode *root,tnode **new_root);
    void free_tree(tnode *node);
    void add_value(double v);
    tnode copy(tnode *root);
    bsearch_tree operator + (const bsearch_tree & t);
    bsearch_tree & operator=(const bsearch_tree & v);
    friend void print(bsearch_tree tree);
    friend ostream& operator<<(ostream& stream,bsearch_tree const root);
private:
    void AddNode(double key,tnode *leaf);
    void SumTree(tnode *tree);
};

И вот файл кода:

#include
#include "head.h"

using namespace std;

tnode::tnode(double key)
{
    this->data = key;
    this->left = NULL;
    this->right = NULL;
}

bsearch_tree::bsearch_tree()
{
    bsearch_tree *root = new bsearch_tree(NULL);
    //root = NULL;
}

bsearch_tree::bsearch_tree(int)
{
    //bsearch_tree *root = new bsearch_tree(NULL);
    root = NULL;
}

void bsearch_tree::duplicate_tree(tnode *root,tnode **new_root)
{
    if(root == NULL)
        return;
    (**new_root) = copy(root);
}

tnode bsearch_tree::copy(tnode *root)
{
    tnode* node = new tnode(root->data);
    if(root == NULL)
        return *node;
    copy(root->left);
    copy(root->right);
    return *node;
}

void bsearch_tree::free_tree(tnode *node)
{
    if(node == NULL)
        return;
    free_tree(node->left);
    free_tree(node->right);
    free(node);
}

void bsearch_tree::add_value(double v)
{
    tnode *tmp;
    if(root == NULL)
    {
        tmp = new tnode(v);
        root = tmp;
    }
    else
        AddNode(v,root);
}
void bsearch_tree::AddNode(double key,tnode *leaf)
{
    if(key >= leaf->data)
    {
        if(leaf->right != NULL)
            AddNode(key,leaf->right);
        else
        {
            tnode * n = new tnode(key);
            leaf->right = n;
        }
    }
    else
    {
        if(leaf->left != NULL)
            AddNode(key,leaf->left);
        else
        {
            tnode * n = new tnode(key);
            leaf->left = n;
        }
    }
}

void print(bsearch_tree tree)
{
    assist(tree.root);
}

void assist(tnode *tmp)
{
    if(tmp)
    {
        assist(tmp->left);
        cout << tmp->data << endl;
        assist(tmp->right);
    }
}

ostream & operator << (ostream & stream,bsearch_tree const root)
{
    print(root);    
    return stream;
}


bsearch_tree bsearch_tree::operator + (const bsearch_tree & t)
{
    bsearch_tree bs;
    SumTree(t.root);
    return *this;
}

void bsearch_tree::SumTree(tnode *tree)
{
    if(tree)
    {
        AddNode(tree->data,root);
        SumTree(tree->left);
        SumTree(tree->right);
    }
}

bsearch_tree & bsearch_tree::operator = (const bsearch_tree & v)
{
    if(this == &v)
        return *this;

    root = v.root;
    return *this;
}

int main()
{
  bsearch_tree bs1;

  bs1.add_value(16.0);  
  bs1.add_value(14.0);  
  bs1.add_value(6.0);  
  bs1.add_value(18.0);  
  bs1.add_value(17.0);  
  bs1.add_value(4.0);  
  bs1.add_value(5.0);  
  bs1.add_value(1.0);  
  bs1.add_value(26.0);  
  bs1.add_value(22.0);  

  cout << "bs1:" << endl;
  print(bs1);

  bsearch_tree bs2;

  bs1 = bs1 = bs1;
  bs2 = bs1;

  bs2.add_value(40.0);
  bs2.add_value(20.0);
  bs2.add_value(60.0);

  cout << "cout << bs2" << endl;
  cout << bs2;

  bsearch_tree bs3;

  //bs3 = bs1 + bs2;
  bs3 = bs1;

  cout << "cout << bs3" << endl;
  cout << bs3; 
  cin.get();
  return 0;
}//main

Поэтому мой вопрос: в основной функции я делаю bsearch_tree bs1; , а затем добавляю к нему несколько узлов, например: bs1.add_value (16.0); , тогда я делаю < code> bsearch_tree bs2; и снова добавляю к нему несколько узлов. Затем я печатаю оба дерева bs1 и bs2, и я нахожу их равными, что неверно.

Как создать метод add_value для добавления узлов в разные деревья? Поэтому, когда я печатаю оба дерева, я получаю разные деревья, поскольку введенные мной узлы отличаются в первую очередь.

благодаря

0
nl ja de
bs1 = bs1 = bs1; WAT
добавлено автор Bartek Banachewicz, источник
Ваш вопрос непонятен - один раз для bs1, когда я это делаю: bs2.add_value (40.0); и один раз для bs1, когда я делаю bs1.add_value (26.0);
добавлено автор asheeshr, источник
Пытался упростить
добавлено автор MaD, источник
Эта основная информация ... Она просто проверяет мое понимание. Я не писал его, и я не могу его изменить
добавлено автор MaD, источник

1 ответы

Ваш оператор = неверен. Вы устанавливаете корень, указывающий на тот же корень второго дерева. Таким образом, с точки зрения использования этого оператора (например, в bs2 = bs1 ;) оба ваших дерева ссылаются на одни и те же общие данные. Вам необходимо реализовать оператор присваивания таким образом, чтобы создать копию данных дерева.

0
добавлено
Да, винтовые деструкторы, которые заботятся о утечке памяти ...
добавлено автор Bartek Banachewicz, источник
@MaD Если вам нужна копия, вам нужно использовать некоторый механизм выделения, например new . Вы также не освобождаете выделенную память - добавьте деструктор. И вы также смешиваете new и free в коде. Не. Используйте new с delete или malloc с помощью free .
добавлено автор SomeWittyUsername, источник
Правильно. Думаю, ты прав. Поэтому я думаю, что я должен использовать «новый» для корня, не так ли?
добавлено автор MaD, источник
@Bartek Banachewicz все еще работает, и я сначала пытаюсь решить ошибки, которые у меня уже есть. Завершение кода будет, как только я решит проблемы.
добавлено автор MaD, источник
@icepack благодарит за советы. Я доберусь до него. Как я уже сказал, это все еще продолжается, и сейчас многое осталось. Я пытаюсь решить проблему operator = сейчас. Еще раз спасибо.
добавлено автор MaD, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest