首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归函数c++的故障分割

递归函数c++的故障分割
EN

Stack Overflow用户
提问于 2019-03-22 06:43:42
回答 2查看 154关注 0票数 0

我在研究预序遍历二叉树算法。但我遇到分割错误:11错误。代码如下所示。

我想知道为什么会发生这个错误。顺便说一句,我已经尝试过非递归算法preorder(),分割错误还会发生.

环境: macOS,clang-800.38

代码语言:javascript
运行
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-22 06:46:49

您需要将节点的leftright成员变量初始化为空指针。

无论如何,如果使用C++,则使用C++而不是C结构。这是代码的示例性C++14版本:

代码语言:javascript
运行
复制
#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());
}
票数 2
EN

Stack Overflow用户

发布于 2019-03-22 06:52:19

问题出现在左侧,您的子节点的右侧未初始化为NULL。由于先前存储在该内存位置的值,程序在if(T!=nullptr)语句中遇到非空值并执行if块。

代码语言:javascript
运行
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55294203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档