主题:先序遍历非递归实现
以下程序是二叉树先序遍历的非递归实现,但老是不能完全通过,请哪位高人帮一下我,我已经奋斗了很久了,拜托了!
#define MAX_TREE_SIZE 10
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
struct BiTNode
{
char data;
BiTNode *lchild,*rchild;
};
typedef BiTNode* BiTree;
void CreateBiTree(BiTree &T) //按先序次序建立树
{
char c;
scanf("%c",&c);
if(c==' ')T=NULL;
else
{
T=new BiTNode;
if(!T)exit(1);
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
int visitT(char e)
{
printf("%c",e);
return 1;
}
struct Stack
{
BiTNode *base;
BiTNode *top;
int stacksize;
};
int InitStack(Stack &S)
{
S.base=new BiTNode[MAX_TREE_SIZE];
if(!S.base)exit(1);
S.top=S.base;
S.stacksize=MAX_TREE_SIZE;
return 1;
}
int StackEmpty(Stack S)
{
if(S.top==S.base)return 1;
else return 0;
}
int GetTop(Stack S,BiTree e)
{
if(S.top>S.base)
{
e=S.top-1;
return 1;
}
else return 0;
}
int Push(Stack &S,BiTree &e)
{
*S.top=*e;
S.top++;
return 1;
}
int Pop(Stack S,BiTree &e)
{
if(S.top==S.base)
return 0;
S.top--;
e=S.top;
return 1;
}
int PreOrderTraverse(BiTree T)//非递归实现
{
Stack S;
InitStack(S);
while(T||!StackEmpty(S))
{
if(T)
{
visitT(T->data);
Push(S,T);
T=T->lchild;
}
else
{
Pop(S,T);
T=T->rchild;
}
}
return 1;
}
void PO(BiTree T) //递归实现
{
if(T)
{
visitT(T->data);
PO(T->lchild);
PO(T->rchild);
}
}
void main()
{
BiTree T;
CreateBiTree(T);
PO(T);
PreOrderTraverse(T);
}
#define MAX_TREE_SIZE 10
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
struct BiTNode
{
char data;
BiTNode *lchild,*rchild;
};
typedef BiTNode* BiTree;
void CreateBiTree(BiTree &T) //按先序次序建立树
{
char c;
scanf("%c",&c);
if(c==' ')T=NULL;
else
{
T=new BiTNode;
if(!T)exit(1);
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
int visitT(char e)
{
printf("%c",e);
return 1;
}
struct Stack
{
BiTNode *base;
BiTNode *top;
int stacksize;
};
int InitStack(Stack &S)
{
S.base=new BiTNode[MAX_TREE_SIZE];
if(!S.base)exit(1);
S.top=S.base;
S.stacksize=MAX_TREE_SIZE;
return 1;
}
int StackEmpty(Stack S)
{
if(S.top==S.base)return 1;
else return 0;
}
int GetTop(Stack S,BiTree e)
{
if(S.top>S.base)
{
e=S.top-1;
return 1;
}
else return 0;
}
int Push(Stack &S,BiTree &e)
{
*S.top=*e;
S.top++;
return 1;
}
int Pop(Stack S,BiTree &e)
{
if(S.top==S.base)
return 0;
S.top--;
e=S.top;
return 1;
}
int PreOrderTraverse(BiTree T)//非递归实现
{
Stack S;
InitStack(S);
while(T||!StackEmpty(S))
{
if(T)
{
visitT(T->data);
Push(S,T);
T=T->lchild;
}
else
{
Pop(S,T);
T=T->rchild;
}
}
return 1;
}
void PO(BiTree T) //递归实现
{
if(T)
{
visitT(T->data);
PO(T->lchild);
PO(T->rchild);
}
}
void main()
{
BiTree T;
CreateBiTree(T);
PO(T);
PreOrderTraverse(T);
}