C语言,数据结构,二叉树的递归构造,求大神教导,使其正常运行。

发布于 2022-09-01 23:18:27 字数 1713 浏览 15 评论 0

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

typedef char ElementType ;

struct binaryTreeNode
{
    ElementType data;
    struct binaryTreeNode *LeftChild,*RightChild;
};
typedef struct binaryTreeNode BinaryTreeNode;

void BTreeCreate(BinaryTreeNode **T)
{
    char x;
    scanf("%c",&x);
    if(x == ' ')
        (*T) = NULL;
    else
    {
        (*T) = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));    
        (*T)->data = x;
    /*三行printf用于检验,发现下面printf语句会发生重复,我百思不得其解,求指导*/
        printf("%d\n",(*T));
        printf("%d\n",(*T)->LeftChild);
        printf("%d\n",(*T)->RightChild);

        BTreeCreate(&((*T)->LeftChild));
        BTreeCreate(&((*T)->RightChild));


    }

}

void PreOrder(BinaryTreeNode *t)
{
    if(t)
    {
        printf("%c",t->data);
        PreOrder(t->LeftChild);
        PreOrder(t->RightChild);
    }
}
void InOrder(BinaryTreeNode *t)
{
    if(t)
    {
        InOrder(t->LeftChild);
        printf("%c",t->data);
        InOrder(t->RightChild);
    }
}
void PostOrder(BinaryTreeNode *t)
{
    if(t)
    {
        PostOrder(t->LeftChild);
        PostOrder(t->RightChild);
        printf("%c",t->data);
    }
}
int main(void)
{
    BinaryTreeNode *t; 
    BTreeCreate(&t);

    
    printf("\n先序:");PreOrder(t);
    printf("\n后序:");InOrder(t);
    printf("\n中序:");PostOrder(t);
    
    printf("\n");

    return 0;
}

输入a,编译结果
图片描述
输入空格,编译结果
图片描述

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

缺⑴份安定 2022-09-08 23:18:27

scanf("%c",&x); 后面加一句: getchar(); 就可以工作了.

原因是, 你每次敲的回车, 还在输入缓存里, 下一次递归, 会跳过输入过程, 直接将 x 获取为 '\n'. 所以会输出两遍...


另外, 提醒一下你.

printf("\n后序:");InOrder(t);
printf("\n中序:");PostOrder(t);

这里写反了. InOrder 是中序, PostOrder 是后序.

洛阳烟雨空心柳 2022-09-08 23:18:27

我打断点简单测了一下,符合我的猜想,即:
先执行

BTreeCreate(&t);
第一次递归,走的是

char x;
scanf("%c",&x);
if(x == ' ')//不符合
    (*T) = NULL;
else
{
//进入else
    (*T) = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));    
    (*T)->data = x;
/*三行printf用于检验,发现下面printf语句会发生重复,我百思不得其解,求指导*/
//输入a之后,走下面的代码(若没有输入就会在else到printf之间循环递归)
//打印第一次printf
    printf("%d\n",(*T));
    printf("%d\n",(*T)->LeftChild);
    printf("%d\n",(*T)->RightChild);

//执行LeftChild的创建,进入第二次递归

    BTreeCreate(&((*T)->LeftChild));
    

//第二次递归,没有输入,if 判断不符合,在else到printf之间循环递归

作业还是要自己做,其他的帮不了

画尸师 2022-09-08 23:18:27

一开始就来讨论并不好...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文