/**********非递归遍历二叉树**********/
#include<stdio.h>
#include<malloc.h>
#define Stack_Init_Size 100
#define StackIncreament 10
typedef struct BiLnode{
int data;
struct BiLnode *lchild;
struct BiLnode *rchild;
}BiLnode,*BiTree;
typedef struct{
BiTree *top;
BiTree *base;
int stacksize;
}SqStack;//定义栈
void InitStack(SqStack &s)
{
s.base=(BiTree *)malloc(Stack_Init_Size*sizeof(BiTree)); //栈底地址
if(!s.base) printf(“error/n”);
s.top=s.base;
s.stacksize =Stack_Init_Size;//构造空栈
}//初始化栈
void Push(SqStack &s, BiTree e)
{
if(s.top -s.base >=s.stacksize)
{//本满,追加存储空间
s.base=(BiTree *)realloc(s.base,
(s.stacksize+StackIncreament)*sizeof(BiTree));
if(!s.base) printf(“error/n”);
s.top=s.base+s.stacksize;
s.stacksize+=StackIncreament;
}
*s.top++=e;
}//向栈顶插入元素e
void Pop(SqStack &s, BiTree &e)
{
if(s.top ==s.base ) printf(“error2/n”);
e=*–s.top ;
}//删除栈顶元素
int StackEmpty(SqStack s)
{
if(s.top ==s.base ) return 1;
else return 0;
}//判断栈是否为空
void CreateBiTree(BiTree &T)
{//单个生成结建立二叉树
printf(“输入7个树结点的值:”);
T=(BiTree)malloc(sizeof(BiLnode));
BiTree p1=T;
BiTree p2=(BiTree)malloc(sizeof(BiLnode));
BiTree p3=(BiTree)malloc(sizeof(BiLnode));
BiTree p4=(BiTree)malloc(sizeof(BiLnode));
BiTree p5=(BiTree)malloc(sizeof(BiLnode));
BiTree p6=(BiTree)malloc(sizeof(BiLnode));
BiTree p7=(BiTree)malloc(sizeof(BiLnode));
scanf(“%d”,&p1->data);p1->lchild = p2; p1->rchild = p6;
scanf(“%d”,&p2->data);p2->lchild = p3; p2->rchild = p5;
scanf(“%d”,&p3->data);p3->lchild = p4; p3->rchild = NULL;
scanf(“%d”,&p4->data);p4->lchild = NULL; p4->rchild = NULL;
scanf(“%d”,&p5->data);p5->lchild = NULL; p5->rchild = NULL;
scanf(“%d”,&p6->data);p6->lchild = NULL; p6->rchild = p7;
scanf(“%d”,&p7->data);p7->lchild = NULL; p7->rchild =NULL;
}
/*
void DLR(BiTree T)
{//先序遍历二叉树
if(!T)
return;
else
{
printf(“%d “,T->data);//访问二叉树树根
DLR(T->lchild);//访问根的左子树
DLR(T->rchild);访问右子树
}
}
*/
void InOrderTraverse(BiTree T,SqStack s)
{
InitStack(s); //初始化栈
BiTree p = T;
Push(s,p); //树根进栈
while(!StackEmpty(s) || !p)
{//当栈空或结点为空时结束
if(p)
{//P非空访问结点,结点进栈,访问该结点左子树
printf(“%d “,p->data);
Push(s,p);
p = p->lchild ;
}
else
{//P空结点出栈,访问右子树
Pop(s,p);
p=p->rchild ;
}
}
}
int main(void)
{
BiTree T;
SqStack s;
CreateBiTree(T);
printf(“输出树元素:”);
InOrderTraverse(T,s);
//DLR(T);
return 0;
}