Странное поведение при использовании очереди, содержащей указатели - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь создать бинарное дерево, которое, когда вы пытаетесь добавить к нему новый узел, добавляет этот узел к первой позиции, которая nullptr.

фактически создает полное бинарное дерево.

Посмотрите на код ниже:

#include <iostream>
#include <queue>
using namespace std;

class node{
private:
    char data;
    node* right;
    node* left;
public:
    node(char n){
        data = n;
        left = nullptr;
        right = nullptr;
    }
    char getdata(){
        return data;
    }
friend class binTree;
};

class binTree{
private:
    node *root;
public:
    binTree(){
        root = nullptr;
    }
    binTree(node *root){
    this->root = root;
    }

    node* getRoot(){
    return this->root;
    }


    void addNode(char data){
        cout << "adding " << data << endl;

        if(root == nullptr) {
            root = new node(data);
            return;
        }


        queue<node*> Q;
        Q.push(root);
        node* toadd;
        while(true) {
            node* toadd = Q.front();
            Q.pop();
            Q.push(toadd->left);
            Q.push(toadd->right);

            if(toadd->left == nullptr)  break;
            if(toadd->right == nullptr) break;
        }

        if((toadd->left) == nullptr)
        {
            cout << "add data to the left of " << toadd -> data << endl;
            toadd->left = new node(data);
        } else if((toadd -> right) == nullptr){
            cout << "add data to the right of " << toadd -> data << endl;
            toadd->right = new node(data);
        } else {
            cout << "toadd left and right are not nullptr" << endl;
        }

    }
};

int main()
{
    binTree bin;
    string s = "abcdefg";
    cout << s << endl << endl;
    for(int i = 0; i < s.size(); i++)
    {
        bin.addNode(s[i]);
    }
}

когда я запускаю этот код, вывод:

abcdefg

adding a
adding b
toadd left and right are not nullptr
adding c
toadd left and right are not nullptr
adding d
toadd left and right are not nullptr
adding e
toadd left and right are not nullptr
adding f
toadd left and right are not nullptr
adding g
toadd left and right are not nullptr

странная часть при печати "toadd влево и вправоне nullptr ", потому что есть while (true) и единственные условия выхода:

            if(toadd->left == nullptr)  break;
            if(toadd->right == nullptr) break;

, поэтому одно из этих условий было истинным, чтобы мы могли разорвать цикл;поэтому мы должны ввести одну из if или else if часть следующего кода (через некоторое время), но, что удивительно, мы вводим часть else и конец печати «toadd left и right не являются nullptr».Кто-нибудь может объяснить это поведение?

1 Ответ

0 голосов
/ 04 декабря 2018

Вы определили toadd дважды, один раз перед циклом и один раз внутри.Легкую ошибку сделать.

...