主题:[讨论]这个二叉树怎么调不通,调了几天了,也知道错误在什么地方!
请看主函数部分:错误地方我会指出
#include<iostream.h>
#include<malloc.h>
#define MaxSize 40
typedef char Elemtype;
typedef struct node
{
Elemtype data;//数据
int lflag,rflag;
struct node *left,*right;//左右指针
} BTree;
void creatree(BTree *&b,char *str)//由广义表样式创建线索二叉树
{
BTree *stack[MaxSize],*p;
int top=-1,j=0;//栈空
int k;//左右指标志
char ch;
b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(': top++;stack[top]=p;k=1;break;
case ')': top--;break;
case ',': k=2;break;
default: p=(BTree*)malloc(sizeof(BTree));
p->data=ch;p->left=p->right=NULL;p->lflag=p->rflag=0;
if(b==NULL)
b=p;//根结点
else
{
if(k==1) stack[top]->left=p;
if(k==2) stack[top]->right=p;
}
}
j++;ch=str[j];
}
}
void printree(BTree *b)//由广义表形式输出二叉树
{
if(b!=NULL)
{
cout<<b->data;
if(b->left!=NULL||b->right!=NULL)
{
cout<<"(";
printree(b->left);
if(b->right!=NULL)
cout<<",";
printree(b->right);
cout<<")";
}
}
}
void thread(BTree *r,BTree *pre)//把二叉树线索化
{
if(r!=NULL)
{
thread(r->left,pre);
if(r->left==NULL)//指向前驱结点
{
r->left=pre;r->lflag=1;
}
if(pre!=NULL&&pre->right==NULL)//指向后继结点
{
pre->right=r;pre->rflag=1;
}
pre=r;
thread(r->right,pre);
}
}
BTree* creatthread(BTree *b)//加上头结点,生成线索二叉树
{
BTree *pre;
BTree *root,*p;
root=(BTree*)malloc(sizeof(BTree));//建立头结点
root->lflag=0;root->rflag=1;//
if(b==NULL)
{
root->left=root;
root->right=root;
}
else
{
p=root->left=b;//curr=(原root)
root->lflag=0;
pre=root;//pre=头root
thread(p,pre);
pre->right=root;//处理最后结点
pre->rflag=1;
root->right=pre;//把头结点右指针指向最后一个结点
root->rflag=1;
}
return root;
}
BTree *first(BTree *root)//求第一个结点
{
while(root->lflag==0)
root=root->left;
return root;
}
BTree *last(BTree *root)//求最后一结点
{
BTree *p=root->right;
return p;
}
BTree *next(BTree *root,BTree *q)//求q的后继结点
{
BTree *p=q->right,*n;//怎么p 为空呀!靠
if(q->rflag==0)
while(p->lflag==0)
p=p->left;
n=p;
if(n==root)
return NULL;
else
return n;
}
BTree *prior(BTree *root,BTree *q)//求q的前驱结点
{
BTree *p=q->left,*n;
if(q->lflag==0)
while(p->rflag==0)
p=p->right;
n=p;
if(n==root)
return NULL;
else
return n;
}
void forward(BTree *root)
{
BTree *p;
for(p=first(root);p!=NULL;p=next(root,p))
cout<<p->data<<" ";
cout<<endl;
}
void back(BTree *root)
{
BTree *p;
for(p=last(root);p!=NULL;
p=prior(root,p))
cout<<p->data<<" ";
cout<<endl;
}
void main()
{
BTree *b,*root;
creatree(b,"(a(b(d),c))");
cout<<"广义表输出二叉树: ";printree(b);
cout<<endl;
root=creatthread(b);
cout<<"中序正向遍历: ";
forward(root); //这个地方,里面的next()函中,第一次循环
//p==NULL,为什么会是空,本来应是下一个结点的 cout<<"中序反向遍历: ";
back(root);
}
#include<iostream.h>
#include<malloc.h>
#define MaxSize 40
typedef char Elemtype;
typedef struct node
{
Elemtype data;//数据
int lflag,rflag;
struct node *left,*right;//左右指针
} BTree;
void creatree(BTree *&b,char *str)//由广义表样式创建线索二叉树
{
BTree *stack[MaxSize],*p;
int top=-1,j=0;//栈空
int k;//左右指标志
char ch;
b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(': top++;stack[top]=p;k=1;break;
case ')': top--;break;
case ',': k=2;break;
default: p=(BTree*)malloc(sizeof(BTree));
p->data=ch;p->left=p->right=NULL;p->lflag=p->rflag=0;
if(b==NULL)
b=p;//根结点
else
{
if(k==1) stack[top]->left=p;
if(k==2) stack[top]->right=p;
}
}
j++;ch=str[j];
}
}
void printree(BTree *b)//由广义表形式输出二叉树
{
if(b!=NULL)
{
cout<<b->data;
if(b->left!=NULL||b->right!=NULL)
{
cout<<"(";
printree(b->left);
if(b->right!=NULL)
cout<<",";
printree(b->right);
cout<<")";
}
}
}
void thread(BTree *r,BTree *pre)//把二叉树线索化
{
if(r!=NULL)
{
thread(r->left,pre);
if(r->left==NULL)//指向前驱结点
{
r->left=pre;r->lflag=1;
}
if(pre!=NULL&&pre->right==NULL)//指向后继结点
{
pre->right=r;pre->rflag=1;
}
pre=r;
thread(r->right,pre);
}
}
BTree* creatthread(BTree *b)//加上头结点,生成线索二叉树
{
BTree *pre;
BTree *root,*p;
root=(BTree*)malloc(sizeof(BTree));//建立头结点
root->lflag=0;root->rflag=1;//
if(b==NULL)
{
root->left=root;
root->right=root;
}
else
{
p=root->left=b;//curr=(原root)
root->lflag=0;
pre=root;//pre=头root
thread(p,pre);
pre->right=root;//处理最后结点
pre->rflag=1;
root->right=pre;//把头结点右指针指向最后一个结点
root->rflag=1;
}
return root;
}
BTree *first(BTree *root)//求第一个结点
{
while(root->lflag==0)
root=root->left;
return root;
}
BTree *last(BTree *root)//求最后一结点
{
BTree *p=root->right;
return p;
}
BTree *next(BTree *root,BTree *q)//求q的后继结点
{
BTree *p=q->right,*n;//怎么p 为空呀!靠
if(q->rflag==0)
while(p->lflag==0)
p=p->left;
n=p;
if(n==root)
return NULL;
else
return n;
}
BTree *prior(BTree *root,BTree *q)//求q的前驱结点
{
BTree *p=q->left,*n;
if(q->lflag==0)
while(p->rflag==0)
p=p->right;
n=p;
if(n==root)
return NULL;
else
return n;
}
void forward(BTree *root)
{
BTree *p;
for(p=first(root);p!=NULL;p=next(root,p))
cout<<p->data<<" ";
cout<<endl;
}
void back(BTree *root)
{
BTree *p;
for(p=last(root);p!=NULL;
p=prior(root,p))
cout<<p->data<<" ";
cout<<endl;
}
void main()
{
BTree *b,*root;
creatree(b,"(a(b(d),c))");
cout<<"广义表输出二叉树: ";printree(b);
cout<<endl;
root=creatthread(b);
cout<<"中序正向遍历: ";
forward(root); //这个地方,里面的next()函中,第一次循环
//p==NULL,为什么会是空,本来应是下一个结点的 cout<<"中序反向遍历: ";
back(root);
}