噜啦噜啦噜呼呼呼 2023-10-31 01:31 采纳率: 66.3%
浏览 8
已结题

二叉树,先序遍历序列

假设二叉树中每个节点值为单个字符,采用二叉链存储结构存储。设计一个算法,求二叉树b的先序遍历序列中第k(1<=k<=二叉树中结点个数)个结点的值

#include<stdio.h>
typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node *lchild;
    struct node *rchild;
}BINode;
int n=1;
ElemType PreNode(BINode *b,int k)   //a指向二叉树的根结点 
{
    if(b==NULL)
        return ' ';
    if(n==k)
        return b->data;
    n++;
    ElemType ch;
    ch=PreNode(b->lchild,k);    //遍历左子树
    if(ch!=NULL)                //如果左子树没有返回空,那么一定是所求的答案 
        return ch;
    ch=PreNode(b->rchild,k);    //如果左子树返回空,则要遍历右子树 
    return ch; 
}

int main()
{
    BINode *node1,*node2,*node3;
    node1->data='a';
    node2->data='b';
    node3->data='c';
    node1->lchild=node2;
    node1->rchild=node3;
    node2->lchild=NULL;
    node2->rchild=NULL;
    node3->lchild=NULL;
    node3->rchild=NULL;
    printf("%c",PreNode(node1,2));
    return 0;
} 

为什么我的输出结果什么都没有啊?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-31 04:18
    关注

    【以下回答由 GPT 生成】

    问题的关键在于没有正确初始化二叉树的节点。

    main()函数中,创建了三个BINode类型的指针node1node2node3,但是没有为这些指针分配内存空间。因此,在对这些指针进行赋值之前,需要使用malloc()函数分配内存。

    此外,在给节点指针赋值后,还需要将节点的左右子节点指针设置为NULL,表示空。

    以下是修正后的代码:

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef char ElemType;
    typedef struct node
    {
        ElemType data;
        struct node *lchild;
        struct node *rchild;
    } BINode;
    
    int n = 1;
    
    ElemType PreNode(BINode* b, int k)
    {
        if (b == NULL)
            return ' ';
        if (n == k)
            return b->data;
        n++;
        ElemType ch;
        ch = PreNode(b->lchild, k);
        if (ch != NULL)
            return ch;
        ch = PreNode(b->rchild, k);
        return ch;
    }
    
    int main()
    {
        BINode* node1 = (BINode*)malloc(sizeof(BINode));
        BINode* node2 = (BINode*)malloc(sizeof(BINode));
        BINode* node3 = (BINode*)malloc(sizeof(BINode));
    
        node1->data = 'a';
        node2->data = 'b';
        node3->data = 'c';
    
        node1->lchild = node2;
        node1->rchild = node3;
        node2->lchild = NULL;
        node2->rchild = NULL;
        node3->lchild = NULL;
        node3->rchild = NULL;
    
        printf("%c", PreNode(node1, 2));
    
        free(node1);
        free(node2);
        free(node3);
    
        return 0;
    }
    

    在修正后的代码中,我们使用malloc()函数为每个节点指针分配了内存空间,并将左右子节点指针设置为NULL,避免了悬空指针的问题。同时,在代码结束前,我们还使用free()函数释放了节点的内存空间。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月4日
  • 创建了问题 10月31日

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含