Ошибка сегментации на рекурсивной функции c ++ - PullRequest
0 голосов
/ 22 марта 2019

Я работал над алгоритмом двоичного дерева предзаказа.Но я встречаюсь с ошибкой сегментации: ошибка 11.Коды показаны следующим образом.

Я хочу знать, почему происходит эта ошибка.Кстати, я пробовал нерекурсивный алгоритм preorder() fault ошибка сегментации все еще происходит.

Среда: macOS, clang-800.0.38

struct Node{
    char val;
    Node* left;
    Node* right;
};

void preorder(Node *T){
    if(T!=NULL){
        cout << T->val;
        preorder(T->left);
        preorder(T->right);
    }
}

int main(){
    Node *T = (Node *)malloc(sizeof(Node));
    Node *p = T;
    p->val = 'A';
    p->left = (Node *)malloc(sizeof(Node));
    p->left->val = 'B';
    p->right = (Node *)malloc(sizeof(Node));
    p->right->val = 'C'; 
    preorder(T);
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Вам нужно инициализировать left и right переменные-члены ваших узлов для нулевых указателей.


В любом случае, если вы используете C ++, используйте C ++, а не конструкции C. Это примерная версия вашего кода на C ++ 14:

#include <iostream>
#include <memory>

struct Node{
   Node(char a) : val(a) { };
   char val;
   std::unique_ptr<Node> left, right;
};

void preorder(Node* p) {
   if (p) {
      std::cout << p->val;
      preorder(p->left.get());
      preorder(p->right.get());
   }
}

int main() {
   auto root = std::make_unique<Node>('A');
   root->left = std::make_unique<Node>('B');
   root->right = std::make_unique<Node>('C');

   preorder(root.get());
}
0 голосов
/ 22 марта 2019

Проблема слева и справа от ваших дочерних узлов не инициализированы в NULL.Из-за предыдущего значения, хранящегося в этой ячейке памяти, программа встречает ненулевое значение в вашем операторе if(T!=nullptr) и выполняет блок if.

struct Node{
    char val;
    Node* left;
    Node* right;
};

void preorder(Node *T){
    if(T!=nullptr){
        cout << T->val;
        preorder(T->left);
        preorder(T->right);
    }
}

int main(){
    Node *T = (Node *)malloc(sizeof(Node));
    Node *p = T;
    p->val = 'A';
    p->left = (Node *)malloc(sizeof(Node));
    p->left->val = 'B';
    p->left->left = nullptr;   //Initialize to NULL
    p->left->right = nullptr;  //Initialize to NULL
    p->right = (Node *)malloc(sizeof(Node));
    p->right->val = 'C'; 
    p->right->left = nullptr;  //Initialize to NULL
    p->right->right = nullptr; //Initialize to NULL
    preorder(T);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...