标题:这个二叉树程序的问题是运行时出现错误,可能是数组越界了,或者指针误操作 ...
只看楼主
qiqid
Rank: 2
等 级:论坛游民
帖 子:36
专家分:12
注 册:2013-3-31
结帖率:100%
已结贴  问题点数:20 回复次数:5 
这个二叉树程序的问题是运行时出现错误,可能是数组越界了,或者指针误操作,大家帮忙看看
在小数据测试的时候输出是正确的,但有些数据可能过不了。
    分别以DLR,LDR,LRD遍历二叉树,同时输出叶子节点以及树的深度。
   
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 10010

int LeafCount;

char s[MAX];
int pos;

typedef struct Node
{
    char ch;

    struct Node *LChild;
    struct Node *RChild;

}BitNode,*BitTree;

void CreateBiTree(BitTree *tree)
{
    if(s[pos]=='$' || s[pos]=='\0')
    {
        (*tree)=NULL;
        pos++;
    }
   
    else
    {
        (*tree)=(BitNode *)malloc(sizeof(BitNode));

        if((*tree)!=NULL)
        {
            (*tree)->ch=s[pos];
            pos++;

            CreateBiTree(&((*tree)->LChild));
            CreateBiTree(&((*tree)->RChild));
        }
    }
}

void Traverse_1(BitTree tree)
{
    if(tree!=NULL)
    {
        printf("%c",tree->ch);

        if(tree->LChild==NULL && tree->RChild==NULL)
        {
            LeafCount+=1;
        }

        Traverse_1(tree->LChild);
        Traverse_1(tree->RChild);
    }
}

void Traverse_2(BitTree tree)
{
    if(tree!=NULL)
    {
        Traverse_2(tree->LChild);
        printf("%c",tree->ch);
        Traverse_2(tree->RChild);
    }
}

void Traverse_3(BitTree tree)
{
    if(tree!=NULL)
    {
        Traverse_3(tree->LChild);
        Traverse_3(tree->RChild);

        printf("%c",tree->ch);
    }
}

int GetDepth(BitTree tree)
{
    int lh,rh,max;
    if(tree!=NULL)
    {
        lh=GetDepth(tree->LChild);
        rh=GetDepth(tree->RChild);

        max=lh>rh?lh:rh;
        
        return (max+1);
    }
    else
        return 0;
}

void DeleteTree(BitTree tree)
/* 释放双亲节点之前要先释放孩子节点 */
{
    if(tree==NULL)
    {
        return;
    }
    DeleteTree(tree->LChild);
    DeleteTree(tree->RChild);
    free(tree);
}

int main()
{
    BitTree bt;
    int depth;
    while(scanf("%s",s)!=EOF)
    {
        pos=0;
        if(strlen(s)==0)
            continue;
        if(1==strlen(s) && s[pos]=='$')
        {
            printf("0\n0\n\n");
        }
        else
        {
            LeafCount=0;

            CreateBiTree(&bt);

            Traverse_1(bt);
            printf("\n");

            Traverse_2(bt);
            printf("\n");

            Traverse_3(bt);
            printf("\n");

            depth=GetDepth(bt);
            printf("%d\n",depth);

            printf("%d\n",LeafCount);

            DeleteTree(bt);

            printf("\n");
        }
        
    }
    return 0;
}
搜索更多相关主题的帖子: include 二叉树 叶子 
2014-05-06 09:14
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:20 
把你过不了的数据也贴出来,这代码没问题,应该是你输入有问题


[fly]存在即是合理[/fly]
2014-05-06 13:27
qiqid
Rank: 2
等 级:论坛游民
帖 子:36
专家分:12
注 册:2013-3-31
得分:0 
还要问一下,我用的是以先序遍历来创建二叉树,所以我输入的序列肯定要符合先序遍历标准。
其实我也不知道哪个数据过不了,学校的OJ就是不让我过,所以我找不到有哪个数据错了。

二楼,假如说我创建二叉树的函数的参数类型变为引用,我又应该怎么改
2014-05-06 16:29
qiqid
Rank: 2
等 级:论坛游民
帖 子:36
专家分:12
注 册:2013-3-31
得分:0 
参数为引用是的代码
void CreateBiTree(BitTree &tree)
{
    char ch;
    if(s[pos]=='\0')
    {
        return;
    }

    ch=s[pos++];

    if(ch=='$')
    {
        tree=NULL;
    }

    else
    {
        tree=(BitTree)malloc(sizeof(BitNode));

        if(tree!=NULL)
        {
            tree->ch=ch;

            CreateBiTree(tree->LChild);
            CreateBiTree(tree->RChild);
        }
    }
}
对应的在main()函数中调用函数改为:CreateBiTree(bt);
这个时候就出现问题了,编译器报错:D:\codeblock\projects\DS\1325\main.c|50|error: expected ';', ',' or ')' before '&' token
我的编译器用的是codeblocks
2014-05-06 17:15
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
C没有引用,C++才有


[fly]存在即是合理[/fly]
2014-05-06 21:32
qiqid
Rank: 2
等 级:论坛游民
帖 子:36
专家分:12
注 册:2013-3-31
得分:0 
-_-||怎么把这点忘了,谢谢
2014-05-08 19:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-431066-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.977730 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved