回 帖 发 新 帖 刷新版面

主题:嫱请问这个程序出了什么问题(遍历二叉树)

#include<iostream.h>
#include<iomanip.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdafx.h>
#define OVERFLOW -1
#define ERROR 0
#define OK 1
typedef struct BiTNode{//注意采用的是二叉链表作为二叉树的存储结构
    TElemType data;
    struct BiTNode*lchild,*rchild;
}BiTNode,*BiTree;

Status CreateBiTree_PreOrder(BiTree&T){//先序次序构造二叉树
    TElemType ch;
    scanf("%c",&ch);
    if(ch=='')T=NULL;
    else{
        if(!(T=(BiTNode*)malloc(sizeof(BiTNode))) exit(OVERFLOW);
        T->data=ch;
        CreateBiTree_PreOrder(T->lchild);
        CreateBiTree-PrOrder(T->rchild);
    }
    return OK;
}
Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){//先序遍历
    if((*Visit)(T->data))
        if(PreOrderTraverse(T->lchild,Visit))
            if(PreOrderTraverse(T->rchild,Visit))
                return OK;
            return ERROR;
}
return OK;
}

Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){//中序遍历
    if(T!=NULL){
        if(InOrderTraverse(T-lchild,Visit))
            if((*Visit)(T->data))
                if(InOrderTraverse(T->rchild,Visit))
                    return OK;
                return ERROR;
                }
    else return OK;
}

Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){//后序遍历
    if(T!=NULL){
        if(PostOrderTraverse(T->lchild,Visit))
            if(PostOrderTraverse(T->rchild,Visit))
                if((*Visit)(T->data))
                    return ERROR;
                }
    else return OK;
}
Status Disp(TElemType e){//输出各结点的数据值
    printf("%3c",e);
    return OK;
}
void main()
{BiTree T;
CreateBiTree_PreOrder(&T);
printf("/n");
PreOrderTraverse(T,Disp);
printf("/n");
InOrderTraverse(T,Disp);
printf("/n");
PostOrderTraverse(T,Disp);
printf("/n");
}

回复列表 (共3个回复)

沙发

CreateBiTree_PreOrder(&T);
你把这里的CreateBiTree_PreOrder(**t),用二级指针写一下这个构造函数,估计你是照严版上的那个例子写的,树上的那个“&”是引用

板凳

1需要定义TElemType 和Status :typedef TElemType ;  typedef  Status ;
2此语句if(ch=='')T=NULL;可能会引起程序歧义,建议改成:if(ch==0)T=NULL;
3此语句if(!(T=(BiTNode*)malloc(sizeof(BiTNode))) exit(OVERFLOW);不需要,直接申请空间即可:T=(BiTree)malloc(sizeof(BiTNode));
4if(InOrderTraverse(T-lchild,Visit))其中T-lchild应该是指针吧:T->lchild
5
Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){//先序遍历
    if((*Visit)(T->data))
        if(PreOrderTraverse(T->lchild,Visit))
            if(PreOrderTraverse(T->rchild,Visit))
                return OK;
            return ERROR;
}
return OK;
}
此函数似乎有两个大挂号,去掉一个{。

3 楼

不好意思,上面第一条应该是定义成
typedef  int TElemType ;  typedef  int  Status ;
漏写了。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册