#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;//*左孩子,右孩子
}*BiTree;
typedef struct StackNode
{
BiTree datas;
struct StackNode *next;//*指向下一结点
}*LinkStack;
void InItStack(LinkStack *a)
{
*a=NULL;
}
void Push(LinkStack *a,BiTree b)
{
LinkStack c;
c=(LinkStack)malloc(sizeof(LinkStack));
c->datas=b;
c->next=*a;
*a=c;
}
void Pop(LinkStack *a,BiTree *b)
{
LinkStack c;
c=*a;
*b=c->datas;
*a=(*a)->next;
free(c);
}
void InItTree(BiTree *a)
{
*a=NULL;
}
void CreateTree(BiTree *a)
{
char *c;
c=(char*)malloc(sizeof(char));
gets(c);
int b;
for(b=0;b<strlen(c);b++)
{
if(!isdigit(c[b]))
{
break;
}
}
if((atoi(c)==0)||(strlen(c)==0))
{
*a=NULL;
}
else
{
*a=(struct BiTNode*)malloc(sizeof(struct BiTNode));
(*a)->lchild=NULL;
(*a)->rchild=NULL;
(*a)->data=atoi(c);
CreateTree(&(*a)->lchild);
CreateTree(&(*a)->rchild);
}
free(c);
}
LinkStack StackEmpty(LinkStack a)
{
return (LinkStack)!a;
}
void InOrderTraveres(BiTree T)
{
if(T)
{
InOrderTraveres(T->lchild);
printf("%d\n",T->data);
InOrderTraveres(T->rchild);
}
}
void InOrderTraveres2(BiTree T)
{
LinkStack S;
BiTree q,p;
p=T;
InItStack(&S);
q=(struct BiTNode*)malloc(sizeof(struct BiTNode));
while(p||!StackEmpty(S))
{
if(p)
{
Push(&S,p);//*进栈
p=p->lchild;
}
else
{
Pop(&S,&q);//*退战
printf("%d\n",q->data);
p=q->rchild;
}
}
}
main()
{
BiTree a;
InItTree(&a);
CreateTree(&a);
InOrderTraveres(a);//*递归算法
printf("-----------------------------\n");
InOrderTraveres2(a);//*非递归算法
system("pause");
return 0;
}
程序运行如下:
|