关于二叉树的东西

时间:2016-11-29 08:43:14

标签: c data-structures

此代码与二叉树有关。 它可以很好地工作。 但是当我按下回车键并得到正确的答案后,它就会停止工作.WHY? 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);
    }
}

1 个答案:

答案 0 :(得分:1)

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

  1. 在CreateBiTree(BiTree * T)函数中,您只修改了root,rchild和lchild的单个指针。你应该在这个函数中本地定义Bitree * T.
  2. 什么是* T == NULL?你在初始化或比较吗?
  3. 的scanf(&#34;%C&#34;,&安培;数据);这个陈述也会在字符情况下产生问题。这句话将等待&#39; \ n&#39;也。所以你应该写scanf(&#34;%c&#34;,&amp; data)。
  4. * T =(BiTree)的malloc(的sizeof(BiTNode));这个语句也错了,malloc返回指针,所以你应该做正确的类型转换。 * T =(BiTree *)malloc(sizeof(BiTNode));
  5. 我修改了你的源代码供你参考,看看

    //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);
        }
    }