/*
中序遍历非递归算法
1.遇到一个结点就把它压栈,并去遍历它的左子树
2.当左子树遍历结束后,把它弹栈并访问它
3.继续中序遍历它的右子树
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct binNode* binTree;
typedef struct Node* Stack;
struct binNode
{
int element;
binTree leftChild, rightChild;
};
struct Node
{
binTree b;
Stack next;
};
void creatStack(Stack s)
{
s->b = NULL;
s->next = NULL;
}
void Push(Stack s, binTree b) //压栈
{
Stack t = (Stack)malloc(sizeof(struct Node));
t->b = b;
t->next = s->next;
s->next = t;
}
binTree Pop(Stack s) //弹栈
{
binTree b = s->next->b;
s->next = s->next->next;
return b;
}
binTree creat() //创造二叉树
{
int n;
binTree b;
scanf("%d", &n);
if (n == 0)
{
b = NULL;
}
else
{
b = (binTree)malloc(sizeof(struct binNode));
b->element = n;
b->leftChild = creat();
b->rightChild = creat();
}
return b;
}
void print(binTree b) //打印
{
binTree bT = b;
Stack s = (Stack)malloc(sizeof(struct Node));
creatStack(s);
while (bT || s->next)
{
while (bT)
{
Push(s, bT);
bT = bT->leftChild;
}
if (s->next)
{
bT = Pop(s);
printf("%d\n", bT->element);
bT = bT->rightChild;
}
}
}
int main(void)
{
binTree bT = creat();
print(bT);
return 0;
}