Saw 发表于 2015-8-28 17:16:36

关于创建树的问题,求鱼友们解答?

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

typedef struct BiNode
{
        char data;
        struct BiNode *lchild,*rchild;
}BiNode,*BiTree;

void preOrderTraverse(BiTree T);
void creatTree(BiTree *tree);

int main()
{
        BiTree tree1=NULL;
        BiTree tree2=NULL;
        printf("please enter the first tree:");
        creatTree(&tree1);
        printf("over");
        preOrderTraverse(tree1);
       

        printf("\nplease enter the second tree:");
        creatTree(&tree2);
        printf("over");
        preOrderTraverse(tree2);

        return 0;
}

void preOrderTraverse(BiTree T)
{
        if(NULL==T)
                return;
       
        printf("%c",T->data);
        preOrderTraverse(T->lchild);
        preOrderTraverse(T->rchild);
}

void creatTree(BiTree *tree)
{
        char c;
        scanf("%c",&c);

        if(' '==c)
        {
                *tree=NULL ;
        }
        else
        {
                *tree=(BiTree)malloc(sizeof(BiNode));
                (*tree)->data=c;
                creatTree(&(*tree)->lchild);
                creatTree(&(*tree)->rchild);               
        }
        return;
}

为什么创建tree2的时候,如果输入和第一次一样的值结束不了递归,要多加两个“##”?

qq546525769 发表于 2015-9-9 00:57:19

指针引用错误,creatTree函数体中指针tred全部不需要解引用,你这个函数是不能创建树的,这个递归要输入空格才能结束,输入空格之后tree指向NULL了,所以函数返回后tree也是指向NULL

qq546525769 发表于 2015-9-9 01:20:11

我错了,其实我也是刚学的,你把creatTree函数中tree指针的解引用去掉就行了,creatTree函数调用格式改成creatTree(tree->lchild),在main函数中的调用改成creatTree(tree),因为指针tree本身就是一个地址,不需要&,手机打字可能有些错别字……

qq546525769 发表于 2015-9-9 01:25:49

看了一会才发现你那个createTree参数是一个双指针 彻底把我搞晕了,

qq546525769 发表于 2015-9-9 01:29:17

指针最好前面用一个小写的p,比如BiTree声明成pBiTree这样可读性高了很多哦

cszdlt 发表于 2015-9-9 20:38:57

样例输入:
1__ ("_"表示空格)
1__

这时,第一颗树只有一个节点,值为'1';
第二颗树在输入完后后两个节点,根节点为'\n',左儿子为'1',右儿子未输入。。。
原因是scanf()函数将回车给当成第二颗树的第一个节点值给接收了,解决方法是在每次建树完后加一个getchar();
页: [1]
查看完整版本: 关于创建树的问题,求鱼友们解答?