c - c中的二叉树->崩溃深度超过7

我在c中做了一个简单的二叉树结构。
在main()中,一棵树被创建,打印和删除(以测试是否一切正常)。
它可以正常工作到7个节点的深度,但是如果我将深度设置为8或更大,它将崩溃。
我已经尝试了很多事情,但是结果总是一样的,我似乎缺少了一些基本概念。
所有评论表示赞赏。

#include<stdio.h>
#include<stdlib.h>

typedef struct tree tree;

struct tree{
    int depth;
    int data;
    tree *up;
    tree *left;
    tree *right;
};

void printTree(tree *node){
    if(node){
        for(int i = 0; i < node->depth; ++i) printf("\t");
        printf("%d: ", node->depth);
        printf("%d\n", node->data);
        printTree(node->left);
        printTree(node->right);
    }
}

void fillTree0(tree *node){
    if(node->depth < 8){ //depth of 8
        //deklaration
        node->left = new tree;
        node->right = new tree;
        //set up
        node->left->up = node;
        node->right->up = node;
        //set depth
        node->left->depth = node->depth +1;
        node->right->depth = node->depth +1;
        //set data 0
        node->left->data = 0;
        node->right->data = 0;
        //recursion
        fillTree0(node->left);
        fillTree0(node->right);
    }
}

void freeTree(tree *node){

    if(node->left) freeTree(node->left);
    if(node->right) freeTree(node->right);

    delete(node->left); node->left = NULL;
    delete(node->right); node->right = NULL;

}


int main(void){

    tree *root;
    root = new tree;

    root->depth = 0;
    root->data = 0;
    fillTree0(root);

    printTree(root);

    freeTree(root);

    return 0;

}

最佳答案

您必须左右初始化指向NULL的节点指针:

    node->left = new tree;
    node->left->left = NULL ;
    node->left->right = NULL ;

    node->right = new tree;
    node->right->left = NULL ;
    node->right->right = NULL ;


因为您的打印功能:

void printTree(tree *node){
    if(node){ //<-- this is equal to if( node != NULL)


依赖于左右无效指针为NULL,否则,您将访问未分配的内存并导致段错误。

本文翻译自 https://stackoverflow.com/questions/20600690/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c tree crash binary-tree depth


相关文章:

c - 在C中嵌入lua代码

c++ - clang格式的自定义控制语句

c - 使用getline()获取用户输入并与while循环中的另一个字符串进行比较

javascript - 使用d3链接生成器的D3 v4可折叠树

javascript - 父节点值为其所有子节点之和

android - 更改活动android.view.InflateException时崩溃:二进制XML文件行#1:错误夸大类<unknown>

ios - PhotoKit:使用requestImageForAsset提取具有PHImageManagerMaximumSize的资产时发生崩溃[assetsd被中断或死亡]

c - 如何在C中的另一个函数中使用一个函数中的一个变量

java - 用Java递归生成树

android - 计算2点之间距离的MapsApp,Android