Печать уровня мудрого двоичного дерева в C ++ - PullRequest
0 голосов
/ 15 апреля 2020

Выход выдаёт - Ошибка выполнения (SIGSEGV). В чем может быть проблема?

ВОПРОС:

Для заданного двоичного дерева распечатайте дерево по уровням. Для печати узла с данными N вам нужно следовать точному формату - N: L: x, R: y гдеr, N - данные любого узла, присутствующего в двоичном дереве. x и y - значения левого и правого потомка узла N. Выведите -1. если какой-либо ребенок является нулевым. Между ними нет места. Вам необходимо распечатать все узлы в форме заказа уровня в разных строках. Формат ввода: элементы в форме порядка уровней (разделенные пробелом) (Если какой-либо узел не имеет левого или правого дочернего элемента, возьмите -1 на его место) Пример ввода:

8 3 10 1 6 - 1 14 -1 -1 4 7 13 -1 -1 -1 -1 -1 -1 -1

Пример вывода:

8: L: 3, R: 10 3: L: 1, R: 6 10: L: -1, R: 14 1: L: -1, R: -1 6: L: 4, R: 7 14: L: 13, R: -1 4: L: -1, R: -1 7: L: -1, R: -1 13: L: -1, R: -1

Вот код:

// Following is the Binary Tree node structure
/**************
class BinaryTreeNode {
    public : 
    T data;
    BinaryTreeNode<T> *left;
    BinaryTreeNode<T> *right;

    BinaryTreeNode(T data) {
        this -> data = data;
        left = NULL;
        right = NULL;
    }
};
***************/

    void printLevelWise(BinaryTreeNode<int> *root) {
        if(root == NULL){
            return;
        }
        cout << root->data << ":";
        queue<BinaryTreeNode<int>*> pendingNodes;
        pendingNodes.push(root);
        while(pendingNodes.size() != NULL){
            BinaryTreeNode<int>* front = pendingNodes.front();
            pendingNodes.pop();
            if(front->left->data != -1){
                cout << "L:" << front->left->data << ",";
                pendingNodes.push(front->left);
                }
            else if(front->left->data == -1){
                cout << "L:" << "-1" << ",";
            }
            if(front->right->data != -1){
                cout << "R:" << front->right->data;
                pendingNodes.push(front->right);
            }
            else if(front->left->data == -1){
                cout << "R:" << "-1";
            }
            cout << endl;


        }
        /* Don't write main().
         * Don't read input, it is passed as function argument.
         * Print output and don't return it.
         * Taking input is handled automatically.
         */

    }

Ответы [ 3 ]

0 голосов
/ 16 апреля 2020

Как сказано в описании, вы должны вывести «-1», если дочерний элемент равен нулю.
Он не говорит, что вы должны вывести «-1», если дочерний элемент data равен -1.
Это будет то же самое, что и печать data, поэтому это не будет описываться как особый случай.
(Очень важно внимательно прочитать описания проблем. Я думаю, что вы путаете это с форматом ввода программы, который имеет -1, чтобы указать на отсутствие дочернего узла, но это не вход для вашей функции.)

Вам нужно

if(front->left != nullptr) {
    cout << "L:" << front->left->data << ",";
    pendingNodes.push(front->left);
}
else {
    cout << "L:" << "-1" << ",";
}

(Вам также необходимо настроить как вы печатаете запятые, но это другая проблема.)

0 голосов
/ 19 апреля 2020
void printLevelWise(BinaryTreeNode<int> *root)
{
    if (root == NULL)
    {
        return;
    }
    queue<BinaryTreeNode<int> *> pendingNodes;
    pendingNodes.push(root);
    while (pendingNodes.size() != NULL)
    {

        BinaryTreeNode<int> *front = pendingNodes.front();
        pendingNodes.pop();
        cout << front->data << ":";

        if (front->left)
        {
            if (front->left->data != -1)
            {
                cout << "L:" << front->left->data << ",";
                pendingNodes.push(front->left);
            }
        }
        else
        {
            cout << "L:"<< "-1"<< ",";
        }


        if (front->right)
        {
            if (front->right->data != -1)
            {
                cout << "R:" << front->right->data;
                pendingNodes.push(front->right);
            }
        }
        else
        {
            cout << "R:"<< "-1";
        }

        cout<<endl;
    }

}
0 голосов
/ 15 апреля 2020

if (front-> left-> data! = -1), когда ваше поддерево не содержит левого узла и вы проверяете left-> data! = - 1, именно поэтому вы получаете ошибку времени выполнения (SIGSEGV)

Используйте этот код

/**************
class BinaryTreeNode {
    public : 
    T data;
    BinaryTreeNode<T> *left;
    BinaryTreeNode<T> *right;

    BinaryTreeNode(T data) {
        this -> data = data;
        left = NULL;
        right = NULL;
    }
};
***************/

    void printLevelWise(BinaryTreeNode<int> *root) {
        if(root == NULL){
            return;
        }
        queue<BinaryTreeNode<int>*> pendingNodes;
        pendingNodes.push(root);
        while(pendingNodes.size() != NULL){

            BinaryTreeNode<int>* front = pendingNodes.front();
            pendingNodes.pop();
            cout << front->data << ":";
            if(front->left){
               if(front->left->data != -1){
                cout << "L:" << front->left->data << ",";
                pendingNodes.push(front->left);
                }
            else{
                cout << "L:" << "-1" << ",";
               }
            }
           if(front->right){
            if(front->right->data != -1){
                cout << "R:" << front->right->data;
                pendingNodes.push(front->right);
              }
            else{
                cout << "R:" << "-1";
            }
           }
        }
        /* Don't write main().
         * Don't read input, it is passed as function argument.
         * Print output and don't return it.
         * Taking input is handled automatically.
         */

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...