#include <stdio.h>
#include <malloc.h>
typedef struct k
{
int data;
struct k *lchild;
struct k *rchild;
}bittree;
typedef struct kl
{
int top;
int size;
bittree **data;
}stack;
//初始化栈
void init(stack *stack,int size)
{
stack->size = size;
stack->top = -1;
stack->data = (bittree**)malloc(size*sizeof(bittree*));
for(int i = 0 ; i < size ; i++)
{
stack->data[i] = NULL;
}
}
//判空
int empty(stack *stack)
{
return stack->top == -1;
}
//判满
int full(stack *stack)
{
return stack->top = stack->size -1;
}
//入栈
void add(stack *stack,bittree *root)
{
if(stack->size == 0) return ;
stack->top++;
stack->data[stack->top] = root;
}
//出栈
bittree *out(stack *stack)
{
return stack->data[stack->top--];
}
//返回栈顶元素
bittree *top(stack *stack)
{
return stack->data[stack->top];
}
//建树
bittree *create()
{
bittree *root = NULL;
int num;
scanf("%d",&num);
if(num > 0)
{
root = (bittree*)malloc(sizeof(bittree));
root->data = num;
root->lchild = create();
root->rchild = create();
}
return root;
}
//后序1
void lastvisit1(bittree *root)
{
if(root == NULL) return;
stack stack;
init(&stack,50);
bittree *token = NULL;
add(&stack,root);
while(!empty(&stack))
{
root = out(&stack);
//条件是 1.叶子 2.右孩子为上一次打印出来的节点 3.有孩子为空,左孩子为上一次打印出来的节点
//1和2条件 是以左部分树为标准的 3条件是在左半部分的条件基础上对右半部分所需条件的补充
if((root->lchild==NULL&&root->rchild==NULL) || root->rchild==token || (root->rchild==NULL&&root->lchild==token))
{
printf("%5d",root->data);
token = root;
continue;
}
add(&stack,root);
if(root->rchild!=NULL) add(&stack,root->rchild);
if(root->lchild!=NULL) add(&stack,root->lchild);
}
}
void lastvisit2(bittree *root)
{
if(root == NULL) return;
stack stack;
init(&stack,50);
bittree *token = NULL;
while(root != NULL)
{
add(&stack,root);
root = root->lchild;
}
while(!empty(&stack))
{
root = out(&stack);
//这里的条件同上 只不过存入节点的次序不同
if((root->lchild==NULL&&root->rchild==NULL) || root->rchild==token || (root->rchild==NULL&&root->lchild==token))
{
printf("%5d",root->data);
token = root;
continue;
}
if(root->rchild!=NULL)
{
add(&stack,root);
root = root->rchild;
while(root != NULL)
{
add(&stack,root);
root = root->lchild;
}
}
}
}
void lastvisit3(bittree *root)
{
if(root == NULL) return;
stack stack;
init(&stack,50);
while(root != NULL)
{
add(&stack,root);
root=root->lchild;
}
bittree *token = NULL;
while(!empty(&stack))
{
root = out(&stack);
if(root->rchild==NULL || root->rchild==token)//精简化的条件
{
printf("%5d",root->data);
token = root;
continue;
}
if(root->rchild != NULL)
{
add(&stack,root);
root=root->rchild;
while(root!=NULL)
{
add(&stack,root);
root = root->lchild;
}
}
}
}
void midvisit1(bittree *root)
{
if(root == NULL) return;
stack stack;
init(&stack,50);
while(root != NULL)
{
add(&stack,root);
root = root->lchild;
}
while(!empty(&stack))
{
root = out(&stack);
printf("%5d",root->data);
if(root->rchild != NULL)
{
root = root->rchild;
while(root != NULL)
{
add(&stack,root);
root = root->lchild;
}
}
}
}
void midvisit2(bittree *root)
{
if(root == NULL) return;
stack stack;
init(&stack,50);
add(&stack,root);
while(!empty(&stack))
{
root = out(&stack);
if(root->rchild==top(&stack)||root->lchild==NULL && root->rchild == NULL)
{
printf("%5d",root->data);
continue;
}
add(&stack,root->rchild);
add(&stack,root);
if(root->lchild!=NULL) add(&stack,root->lchild);
}
}
void previsit1(bittree *root)
{
if(root == NULL) return;
stack stack;
init(&stack,50);
add(&stack,root);
while(!empty(&stack))
{
root = out(&stack);
printf("%5d",root->data);
if(root->rchild!=NULL) add(&stack,root->rchild);
if(root->lchild!=NULL) add(&stack,root->lchild);
}
}
void previsit2(bittree *root)
{
if(root == NULL) return;
stack stack;
init(&stack,50);
while(root != NULL)
{
printf("%5d",root->data);
add(&stack,root);
root = root->lchild;
}
while(!empty(&stack))
{
root = out(&stack);
if(root->rchild!=NULL)
{
root=root->rchild;
while(root != NULL)
{
printf("%5d",root->data);
add(&stack,root);
root = root->lchild;
}
}
}
}
int main()
{
bittree *root = create();
previsit2(root);
return 0;
}
如需详细注释 请看博主文章(有专门针对三种遍历的文章)