#include
我们拥有十多年网页设计和网站建设经验,从网站策划到网站制作,我们的网页设计师为您提供的解决方案。为企业提供网站设计、成都网站设计、微信开发、微信小程序定制开发、成都手机网站制作、H5网站设计、等业务。无论您有什么样的网站设计或者设计方案要求,我们都将富于创造性的提供专业设计服务并满足您的需求。
iostream.h
#include
stdio.h
#include
malloc.h
#define
MaxNode
100
typedef
char
DataType;
typedef
struct
node
{
DataType
data;
struct
node
*lchild;
struct
node
*rchild;
}BiTNode,BiTree;
void
CreateBiTree(BiTree
*bt)//建立一个二叉树
{
char
ch;
//ch=getchar();
scanf("%c",ch);
if
(ch=='
')
bt=NULL;
else{
bt=(BiTree*)malloc(sizeof(BiTNode));
bt-data=ch;
CreateBiTree(bt-lchild);
CreateBiTree(bt-rchild);
}
}
void
PreOrder(BiTree
*root)//前序遍历
{
if(root!=NULL)
{
Visit(root-data);
PreOrder(root-lchild);
PreOrder(root-rchild);
}
}
void
InOrder(BiTree
*root)//中序遍历
{
if(root!=NULL)
{
InOrder(root-lchild);
Visit(root-data);
InOrder(root-rchild);
}
}
void
LaOrder(BiTree
*root)//后序遍历
{
if(root!=NULL)
{
PreOrder(root-lchild);
PreOrder(root-rchild);
Visit(root-data);
}
}
void
main()
{
BiTree
*bt;
printf("请输入数据:\n");
bt=
NULL;
CreateBiTree(bt);
//and
here
printf("\n
结果如下:\n");
printf("先序遍历的结果为:\n");
PreOrder(bt);
printf("\n");
printf("中序遍历的结果为:\n");
InOrder(bt);
printf("\n");
printf("后序遍历的结果为:\n");
LaOrder(bt);
}
有个Visit()函数
你没写!!
我只是改了语法错误!!
只剩那一个函数没定义
你定义下就没语法错误了!
!
#include"cstdio"
#include"vector"
#include"cstring"
#include"algorithm"
using namespace std;
const int maxn =30;
struct node{
int data;
node* lchild;
node* rchild;
};
int n;
int in[maxn];
bool vis[maxn]={false};
vectorint lev;
node* create(vectorint lev,int inl,int inr){
if(lev.size()==0) return NULL;
if(inlinr) return NULL;
//printf("00\n");
node* root= new node;
root-data =lev[0];
int k;
for(k=inl;k=inr;k++){
if(lev[0]==in[k])
break;
}
for(int j=inl;j=k-1;j++)
vis[in[j]]=true;
vectorint tempLeft,tempRight;//要函数体内新建
for(int i=1;ilev.size();i++){
if(vis[lev[i]]==true)
tempLeft.push_back(lev[i]);
else
tempRight.push_back(lev[i]);
}
root-lchild =create(tempLeft,inl,k-1);
root-rchild =create(tempRight,k+1,inr);
return root;
}
void preorder(node* root){
if(root==NULL)
return;
printf("%d ",root-data);
preorder(root-lchild);
preorder(root-rchild);
}
int main(){
scanf("%d",n);
int x;
for(int i=0;in;i++){
scanf("%d",x);
lev.push_back(x);
}
for(int j=0;jn;j++)
scanf("%d",in[j]);
node *root =create(lev,0,n-1);
preorder(root);
return 0;
}
先看下creat这个函数:
status creat(bitnode *t)/*先序建立二叉树*/
{
char ch;
ch=getch();putch(ch);
if(ch=='0') t=NULL;
else
{
t=(bitnode *)malloc(sizeof(bitnode));
if(!t)
exit(OVERFLOW);
t-data=ch;
creat(t-lchild);
creat(t-rchild);
}
return OK;
}
其中有句代码是t=(bitnode *)malloc(sizeof(bitnode));
这是给t赋值,由于t是参数,这样做是不能返回的。
我知道你的意思是想通过指针返回,但是那样的用法应该是对t所指向的变量赋值,也就是对*t赋值。
如果你还没理解的话看下函数里的递归调用:creat(t-lchild);调用函数后,本意是要给t-lchild赋值的,但是是做不到的,因为要改变一个变量的值的话,应该传的是它的地址。
可能你觉得有点乱了,我举个函数中用指针做参数来返回的例子:
假如要用指针返回一个整型的变量,那么指针应该是指向整型变量的,即int*
这里应该是要返回一个struct bitnode *类型的,也就是返回的值就是个指针,那么参数就应该是一个指向这种指针的指针,即struct bitnode **
可以这么修改:
status creat(bitnode **t) //多了个*
{
char ch;
ch=getch();putch(ch);
if(ch=='0') *t=NULL; //多了个*
else
{
*t=(bitnode *)malloc(sizeof(bitnode)); //多了个*
if(!*t) //多了个*
exit(OVERFLOW);
(*t)-data=ch;
creat((*t)-lchild); //注意不同
creat((*t)-rchild);
}
return OK;
}
主函数这么改
status main()
{
bitnode* t1; //多了个*
creat(t1);
pre(t1,print); //少了个
getch();
return 0;
}
另外一个编译错误就是
int pre(bitnode *t,status (*visit)())
指针函数后面应该带参数,改为
int pre(bitnode *t,status (*visit)(bitnode *))
void PreOrderTraverse(BiTree T) /*先序遍历*/
{
if(T!=NULL)
{
printf("%c ",T-data);
PreOrderTraverse(T-lchild);
PreOrderTraverse(T-rchild);
}
}
void InOrderTraverse(BiTree T)/*中序遍历*/
{
if(T!=NULL)
{
InOrderTraverse(T-lchild);
printf("%c ",T-data);
InOrderTraverse(T-rchild);
}
}
void PostOrderTraverse(BiTree T) /*后序遍历*/
{
if(T!=NULL)
{
PostOrderTraverse(T-lchild);
PostOrderTraverse(T-rchild);
printf("%c ",T-data);
}
}