源代码:
#include<stdio.h>
#include<malloc.h>
#define SIZE 100
#define STACKINCREMENT 10
#define FALSE 1
#define ERROR 0
#define OK 1
#define NO 0
//二叉树
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
typedef int Status;
BiTree T;
//栈的结构体
typedef struct
{
BiTree a;
} SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
} Stack;
Status CreateBiTree(BiTree *T)
{
char ch;
scanf("%c",&ch);
if (ch==' ')
*T = NULL;
else
{
if (!((*T) = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
(*T)->data = ch;
CreateBiTree(&((*T)->lchild)); // 构造左子树
CreateBiTree(&((*T)->rchild)); // 构造右子树
}
return OK;
} // CreateBiTree
int vi(char c)
{
printf("%c ",c);
return OK;
}
//先序遍历的递归
void PreOrder(BiTree T)
{
if(T)
{
vi(T->data); //访问结点
PreOrder(T->lchild); //遍历左子树
PreOrder(T->rchild); //遍历右子树
}
}
//栈操作
Status InitStack(Stack *S)
{
S->base=(SElemType *)malloc(SIZE*sizeof(SElemType));
if(!S->base) exit(0);
S->top=S->base;
S->stacksize=SIZE;
return OK;
}
Status Push(Stack *S,SElemType e)
{
if(S->top-S->base>=S->stacksize)
{
S->base=(SElemType *)malloc((S->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S->base) exit(0);
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return OK;
}
Status Stackempty(Stack S)//栈是否为空
{
if(S.top==S.base)
return OK;
else
return NO;
}
Status Pop(Stack *S,SElemType *e)
{
if(S->top==S->base) return ERROR;
*e=*--S->top;
return OK;
}
Status StackLength(Stack S)//求栈的长度
{
return (S.top-S.base);
}
//中序遍历的递归
Status InOrderTraverse(BiTree T, Status (*Visit)(char)) {
// 算法6.3
// 采用二叉链表存储结构,Visit是对数据元素操作的应用函数。
// 中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit。
Stack S;
SElemType p;
InitStack(&S); p.a = T;
while (p.a || !Stackempty(S)) {
if (p.a) { Push(&S, p); p.a = p.a->lchild; } // 非空指针进栈,继续左进
else { // 上层指针退栈,访问其所指结点,再向右进
Pop(&S, &p);
if (!Visit(p.a->data)) return ERROR;
p.a = p.a->rchild;
}
}
return OK;
} // InOrderTraverse
//后序遍历的递归
void PostOrder(BiTree T)
{
// 采用二叉链表存储结构,Visit是对数据元素操作的应用函数。
// 中序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
if(T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
vi(T->data);
}
} // InOrderTraverse
int main()
{
printf("先序输入二叉树(空格代表空节点):\n");
CreateBiTree(&T);
printf("递归先序输出二叉树:\n");
PreOrder(T);
printf("\n");
printf("非递归中序输出二叉树:\n");
InOrderTraverse(T, vi);
printf("\n");
printf("递归后序输出二叉树:\n");
PostOrder(T);
printf("\n");
return 0;
}
运行结果: