You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言顺序存储结构二叉树创建失败无输出问题求解

问题诊断

你的结构体定义本身没有错误,无法正常输出是内存访问、输入逻辑等环节的问题,具体错误如下:

  • 野指针批量访问:main函数中定义的Bitree *t1未初始化就直接传入create函数,属于野指针访问;同时Bitree结构体内的Tree *a[100]数组存储的都是树节点指针,没有给每个指针分配Tree类型的内存空间就直接访问->data成员,直接触发内存访问错误。
  • 输入格式错误:所有scanf("%d ",&x)语句中%d后面多写了空格,会导致输入数字后需要额外输入非空白字符程序才会继续执行,输入逻辑全程卡住。
  • 多余的无效代码:create函数开头对tree1->a[0]的赋值操作完全无用,你的二叉树是从下标1开始存储的,这段代码只会额外触发野指针访问。
  • 指针未初始化导致遍历逻辑错误:创建每个树节点时只赋值了data成员,left和right指针都是随机野值,前序遍历中判断x->left!=NULL/x->right!=NULL的逻辑完全失效,会访问非法内存。
修复方案
  1. 先在create函数内完成Bitree结构体的内存分配,再给每个用到的Tree节点分配内存,同时初始化left/right指针为NULL。
  2. 删掉所有scanf语句中%d后面的多余空格。
  3. 删掉create函数中对a[0]的无用操作代码。
  4. main函数不需要预先定义Bitree指针,直接接收create函数返回的已经分配好内存的结构体指针即可。
修复后完整可运行代码
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node* left;
    struct node* right;
}Tree;
typedef struct bit
{
    Tree *a[100];
    int length;
}Bitree;

typedef struct Stack
{
    Tree *sq[1000];
    int top;
}stack;

int empty(stack s)
{
    return s.top==-1;
}

void push(stack *s,Tree *p)
{
    s->sq[++s->top]=p;
}

void pop(stack *s)
{
    if(s->top!=-1)
    {
        s->top--;
    }
}
//return the top element
Tree *top(stack s)
{
    if(s.top!=-1)
        return s.sq[s.top];
    return NULL;
}
Bitree *create(int n)
{
    // 先给Bitree分配内存
    Bitree *tree1 = (Bitree*)malloc(sizeof(Bitree));
    tree1->length=0;
    int x;
    printf("请输入根节点\n");
    scanf("%d",&x);
    // 给根节点分配内存
    tree1->a[1] = (Tree*)malloc(sizeof(Tree));
    tree1->a[1]->data = x;
    tree1->a[1]->left = NULL;
    tree1->a[1]->right = NULL;
    tree1->length++;
    for(int i=2;i<=n;i++)
    {
        // 先给当前节点分配内存
        tree1->a[i] = (Tree*)malloc(sizeof(Tree));
        tree1->a[i]->left = NULL;
        tree1->a[i]->right = NULL;
        if(i%2==0)
        {
            printf("please input left binary tree of node %d\n", tree1->a[i/2]->data);
            scanf("%d",&x);
            tree1->a[i]->data=x;
            tree1->a[i/2]->left=tree1->a[i];
            tree1->length++;
        }
        else
        {
            printf("please input right binary tree of node %d\n", tree1->a[i/2]->data);
            scanf("%d",&x);
            tree1->a[i]->data=x;
            tree1->a[i/2]->right=tree1->a[i];
            tree1->length++;
        }
    }
    return tree1;
}
void preorder1(Bitree *t)
{
    stack s;
    s.top=-1;
    if(t->a[1]!=NULL) {
        push(&s,t->a[1]);
    }
    while(!empty(s))
    {
        Tree *x=top(s);
        pop(&s);
        printf("%d ",x->data);
        if(x->right!=NULL)
            push(&s,x->right);
        if(x->left!=NULL)
            push(&s,x->left);
    }
}
int main()
{
    int n;
    printf("请输入二叉树总节点数:\n");
    scanf("%d",&n);
    Bitree *t1 = create(n);
    printf("前序遍历结果:\n");
    preorder1(t1);
    // 可选:添加内存释放逻辑避免内存泄漏
    return 0;
}

内容的提问来源于stack exchange,提问作者waggghhh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:54:03