二叉树中序遍历非递归的问题 弄了好久都没解决 望高手指点
tree.h为:
#include<stdio.h>
#define MAX 50
typedef struct node
{
char data;
node * Lsubtree;
node * Rsubtree;
}node ,*Tnode;
typedef node Elemtype;
typedef struct stack
{
Elemtype data[MAX];
int top;
} Stack;
void CreateTree(Tnode *tree )
{
char ch;
scanf("%c",&ch);
if(ch=='\n')
{
return ;
getchar();
}
else if(ch=='.')
{
*tree=NULL;
}
else
{
*tree=(node *)malloc(sizeof(node ));
(*tree)->data=ch;
CreateTree(&(*tree)->Lsubtree);
CreateTree(&(*tree)->Rsubtree);
}
return;
}
void PreOrder(Tnode tree)
{
if(tree!=NULL)
{
printf("%c",tree->data);
PreOrder(tree->Lsubtree);
PreOrder(tree->Rsubtree);
}
}
void InOrder(Tnode tree)
{
if(tree!=NULL)
{
InOrder(tree->Lsubtree);
printf("%c",tree->data);
InOrder(tree->Rsubtree);
}
}
void PostOrder(Tnode tree)
{
if(tree!=NULL)
{
PostOrder(tree->Lsubtree);
PostOrder(tree->Rsubtree);
printf("%c",tree->data);
}
}
void Access(char c)
{
printf("%c",c);
}
void InitStack(Stack *S)
{
S=(Stack *)malloc(sizeof(Stack));
S->top=-1;
}
bool EmptyStack(Stack * S)
{
if(S->top==-1)
return true;
else
return false;
}
void PushStack(Stack *S,Elemtype *tree)
{
if(S->top=MAX-1)
return;
S->top++;
S->data[S->top]=*tree;
}
void PoPStack(Stack *S,Elemtype *tree )
{
if(S->top==-1)
return;
*tree=S->data[S->top];
S->top--;
}
void N_INorder(Stack &S,Tnode &tree)
{
Tnode p=tree;
do
{
while(p!=NULL)
{
PushStack(S,p);
p=p->Lsubtree;
}
// if(S->top==-1)
// {
// printf("栈为空!!!\n");
// }
// else
// {
PoPStack(&S,p);
Access(p->data);
p=p->Rsubtree;
// }
}while(p!=NULL&&!(EmptyStack(&S)));
}
void Access(char c);
void CreateTree(Tnode *tree);
void PreOrder(Tnode tree);
void InOrder(Tnode tree);
void PostOrder(Tnode tree);
void PushStack(Stack *S,Elemtype tree);
void PoPStack(Stack *S,Elemtype *tree);
void N_INorder(Stack &S,Tnode &tree);
bool EmptyStack(Stack S);
///////////////////////////////////////////
主函数为:
#include<stdio.h>
#include<malloc.h>
#include"tree.h"
void main()
{
Tnode t;
Stack S;
InitStack(&S);
printf("创建一棵二叉树!\n");
printf("请输入要创建的二叉树('.'代表子树为空):");
CreateTree(&t);
printf("先根遍历递归算法得的二叉树为:\n");
PreOrder(t);
printf("\n");
printf("中根遍历递归算法得的二叉树为:\n");
InOrder( t);
printf("\n");
printf("后根遍历递归算法得的二叉树为:\n");
PostOrder(t);
printf("\n");
printf("非递归中根遍历算法的结果为:");
N_INorder(S,t);
printf("\n");
}