【问题标题】:something about binary tree关于二叉树的一些事情
【发布时间】:2016-11-29 08:43:14
【问题描述】:

这段代码是关于二叉树的。 它可以很好地工作。 但是当我按回车键并得到正确答案后,它竟然停止工作。为什么? This is the answer 源代码:

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

typedef struct BiTNode
{
    char data;
    struct BiTNode* rchild;
    struct BiTNode* lchild;
}BiTNode;
typedef BiTNode* BiTree;
int CreateBiTree(BiTree *T);
void Visit(BiTree T);
void PreOrder(BiTree T);
void InOrder(BiTree T);
void PostOrder(BiTree T);

int main(void)
{
    BiTree T;
    CreateBiTree(&T);
    PreOrder(T);
    return 0;
}

int CreateBiTree(BiTree *T)
{
    char data;
    scanf("%c",&data);
    if(data=='#')
    {
        *T==NULL;
    }
    else
    {
        *T=(BiTree)malloc(sizeof(BiTNode));
        (*T)->data=data;
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }
    return 0;
}

void Visit(BiTree T)
{
        printf("%c",T);
}

void PreOrder(BiTree T)
{
    if(T!=NULL)
    {
        Visit(T);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}

【问题讨论】:

标签: c data-structures


【解决方案1】:

在您的代码中,您有很多问题:-

  1. 在 CreateBiTree(BiTree *T) 函数中,您只修改了 root、rchild 和 lchild 的单个指针。您应该在此函数中本地定义 Bittree *T。
  2. 什么是*T==NULL?您是在初始化还是比较?
  3. scanf("%c",&data);此语句还会在字符大小写方面产生问题。该语句也将等待 '\n'。所以你应该写 scanf(" %c",&data)。
  4. *T=(BiTree)malloc(sizeof(BiTNode));这句话也是错误的,malloc返回指针,所以你应该做正确的类型转换。 *T=(BiTree *)malloc(sizeof(BiTNode));

我已经修改了你的源代码供你参考,看看

//it can work
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef struct BiTNode
{
    char data;
    struct BiTNode* rchild;
    struct BiTNode* lchild;
}BiTNode;
typedef BiTNode BiTree;
BiTree *CreateBiTree();
void Visit(BiTree **T);
void PreOrder(BiTree *T);
void InOrder(BiTree T);
void PostOrder(BiTree T);
int main(void)
{
    BiTree *T;
    T=CreateBiTree();
    PreOrder(T);
    return 0;
}
BiTree *CreateBiTree()
{
    BiTree *T;
    char data;
    scanf(" %c",&data);
        printf("............%c\n",data);

    if(data=='#')
        return NULL;

    T=(BiTree *)malloc(sizeof(BiTree));
    T->data=data;

    printf("Enter left child of %c:\n",data);
    T->lchild=CreateBiTree();

    printf("Enter right child of %c:\n",data);
    T->rchild=CreateBiTree();

    return T;
}
void Visit(BiTree **T)
{
        printf("%c",(*T)->data);
}
void PreOrder(BiTree *T)
{
    if(T!=NULL)
    {
        Visit(&T);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}

【讨论】:

  • 抱歉,我想知道scand()是什么?(我是初学者,高中生)
  • @Bugmaker scand()?
  • 你写“所以你应该写 scand(" %c",&data)." 在#3的末尾。 :)
  • 对于#4,BiTree是指向BiTNode的指针,所以*T=(BiTree)malloc(sizeof(BiTNode))对吗?
  • 它会工作,但我建议你做简单的代码。简单的编码也可以帮助您进行调试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多