хотел вернуть корень узла дерева с последним добавлением узла без изменений - PullRequest
0 голосов
/ 27 апреля 2018

Проблема: корневому узлу присваивается значение NULL, а фактическое добавление узлов в дереве не происходит:

Клиентская программа:

int main () {

int arr [] = {15, 10, 100, 5, 13, 90, 80, 50, 10, 5, 3};
int len = sizeof(arr)/sizeof(*arr);

using namespace btree;
//create an instance of btree::tree;
btree::tree* tree = new btree::tree();
btree::btnode* root = tree->get_root_btnode();

//create tree
tree->create_btree (root, arr, len);

delete tree;
return 0;

}

Функции-члены (используемые в клиентской программе) выглядят следующим образом:

//creates a complete tree
void tree::create_btree (btnode* root, int arr[], int len) {

    for (int i = 0; i < len; i++) {
        add_a_btnode (root, arr[i]);
    }
    std::cout << "Tree creation successful!!" << std::endl;
}

void tree::add_a_btnode (btnode* root, int data) {
    ///check if tree is empty
    btnode *current = root;
    if (!current) {
        btnode* newbtnode = new btnode(data);
        root = newbtnode;
        return;
    }

    if (current->get_left_btnode() != nullptr) {
        //can we add it as right child of current btnode?
        if (current->get_right_btnode() != nullptr) {
            //recurse
            add_a_btnode (current->get_left_btnode(), current->get_data());
        } else {
            btnode* newbtnode = new btnode(data);
            current->m_right = newbtnode;
        }
    } else {
        btnode* newbtnode = new btnode(data);
        current->m_left = newbtnode;
    }
    std::cout << "a root btnode is added with data: " << data << endl;
}

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

btnode* tree::get_root_btnode () { return m_root_btnode; }

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Ваша проблема здесь:

if (!current) {
    btnode* newbtnode = new btnode(data);
    root = newbtnode;
    return;
}

Вы создаете корневой узел и сохраняете его в переменную root. Но это локальная переменная, и фактически вы вообще не модифицируете объект дерева.

Вместо этого вы должны сохранить его в переменной внутри вашего tree класса. Так было бы что-то вроде этого:

if (!current) {
    m_root_btnode = new btnode(data);
    return;
}

Btw. Почему вы передаете указатель на root в качестве аргумента, когда функции являются методами класса tree и у вас есть доступ к исходной корневой переменной? Это было бы намного чище, и тогда вы бы не совершили эту ошибку.

0 голосов
/ 27 апреля 2018

Измените функцию create_btree следующим образом:

void tree::create_btree(int arr[], int len) {
    if (len > 0) {
        m_root_btnode = new btnode(arr[0]);
    }
    for (int i = 1; i < len; i++) {
        add_a_btnode(m_root_btnode, arr[i]);
    }
    std::cout << "Tree creation successful!!" << std::endl;
}

Есть много проблем с вашим кодом, но я бы начал с этого.

...