Функция ничего не добавляет к моему BST-дереву - PullRequest
0 голосов
/ 07 июня 2018
class node{
public:
    int data;
    node *left;
    node *right;
};

class BFStree{
public:
    void insert(int key);
    void deleteNode(int key);
    void inorderTraversal(node *temp);
    void inorder();
    node *root;
    BFStree(){
        root = NULL;
    }
};

 void BFStree::insert(int key){
    node *temp = root;
        while(temp!=NULL){
            if(key>temp->data){
                temp = temp->right;
            }
            else if(key<temp->data){
                temp = temp->left;
            }
            else{
                cout << "NOT ALLOWED TO HAVE SAME DATA" << temp->data << " " << key << endl;
            }
        }
        node *temp2 = new node;
        temp2->data = key;
        cout << key << " inserted" << endl;
        temp2->left = NULL;
        temp2->right = NULL;
        temp = temp2;
    }

int main(){
    BFStree t;
    t.insert(7);
    t.insert(3);
    t.insert(21);
}

Я пытаюсь использовать вышеупомянутую функцию для вставки данных в дерево bst, но ничего не происходит, даже корень НЕДЕЙСТВИТЕЛЕН, но когда я использую следующую функцию, работа выполнена.Я не понимаю, что я сделал по-разному в двух кодах.Я новичок в программировании, поэтому у меня такие плохие сомнения.Пожалуйста, помогите мне очистить его.

void BFStree::insert(int key){
    node *temp = root;
    if(temp==NULL){
        temp = new node;
        temp->data = key;
        temp->left = NULL;
        temp->right = NULL;
        root = temp;
        return;
    }
    while(1){
        if(key>temp->data){
            if(temp->right==NULL){
                node *temp2 = new node;
                temp2->data = key;
                temp2->left = NULL;
                temp2->right = NULL;
                temp->right = temp2;
                break;
            }
            else{
                temp = temp->right;
            }
        }
        else if(key<temp->data){
            if(temp->left==NULL){
                node *temp2 = new node;
                temp2->data = key;
                temp2->left = NULL;
                temp2->right = NULL;
                temp->left = temp2;
                break;
            }
            else{
                temp = temp->left;
            }
        }
    }
}

1 Ответ

0 голосов
/ 07 июня 2018

Основная проблема в вашей первой функции заключается в том, что вы просто перебираете дерево, пока не найдете нулевое значение, и после этого присваиваете это нулевое значение значению temp.

После этого вы создаете новый узел и назначаете временную ссылку на новый узел.Но ваш временный узел не связан с деревом.И нет никакой связи между временным узлом и его родительским или корневым узлом дерева.

Тогда как во 2-м примере:

if(temp->right==NULL){
            node *temp2 = new node;
            temp2->data = key;
            temp2->left = NULL;
            temp2->right = NULL;
            temp->right = temp2;
            break;
 }

Это ключ, вы храните ссылку вашеговновь созданный узел в правом или левом дочернем узле его родительского узла.

...