对二叉树的遍历进行实现的算法:
(1)定义二叉树的二叉链表存储结构。
(2)编写建立一棵二叉树算法。
(3)编写中序遍历二叉树算法。
(4)编写后序遍历二叉树算法。
(5)编写算法主程序。
(6)调试运行,记录结果。
编写头文件 Bitree.h
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define OVERFLOW -2
#define INFEASIBLE -1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char TElemType;
typedef int Status;
//二叉树的二叉链表存储表示
typedef struct BiTNode {
TElemType data;
struct BiTNode * lchild,* rchild;
} BiTNode,* BiTree;
//创建二叉树
Status CreatBiTree(BiTree &T){
char ch;
scanf("%c",&ch);
if (ch == '#') T=NULL;
else {
if (!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
return OK;
}
typedef BiTree SElemType;
//栈的顺序存储表示
typedef struct SqStack{
SElemType * base;
SElemType * top;
int StackSize;
}SqStack;
Status InitStack(SqStack &S){
S.base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));
if(!S.base) exit (OVERFLOW); //存储分配失败
S.top=S.base;
S.StackSize=STACK_INIT_SIZE;
return OK;
} //InitStack
Status GetTop(SqStack S,SElemType &e){
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if (S.top==S.base) return ERROR;
e= *(S.top-1);
return OK;
}//GetTop
Status Push(SqStack &S,SElemType &e){
//插入元素e为新的栈顶元素
if (S.top-S.base>=S.StackSize) {//栈满,追加存储空间
S.base=(SElemType *) realloc(S.base,
(S.StackSize+STACKINCREMENT)*sizeof(SElemType));
if (! S.base)exit(OVERFLOW);//存储分配失败
S.top=S.base+S.StackSize;
S.StackSize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push
Status Pop(SqStack &S,SElemType &e){
//若栈不空,则删除S的栈顶元素,
//用 e返回其值,并返回OK;否则返回ERROR
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}//Pop
//若栈为空栈,则返回true,否则返回false
Status StackEmpty(SqStack &S){
if (S.top == S.base) return TRUE;
else return FALSE;
}
//中序遍历二叉树
Status InOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
SqStack S;
BiTree p;
InitStack(S); Push(S,T);
while (!StackEmpty(S)){
while (GetTop(S,p) && p) Push(S,p->lchild);
Pop(S,p);
if (!StackEmpty(S)) {
Pop(S,p);
if (!Visit (p->data)) return ERROR;
Push(S,p->rchild);
}
}
return OK;
}//InOrderTraverse
//后序遍历二叉树
Status PostOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
if (T) {
if (PostOrderTraverse(T->lchild,Visit))
if(PostOrderTraverse(T->rchild,Visit))
if(Visit(T->data))
return OK;
return ERROR;
}else return OK;
}//PostOrderTraverse
//调用Visit函数
Status PrintElement (TElemType e){
printf("%c",e);
return OK;
}
实现的主函数:test.c
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include "Bitree.h"
void main(){
BiTree T;
printf("输入二叉树中结点的值:\n");
CreatBiTree(T);
printf("中序遍历二叉树:\n");
InOrderTraverse(T,PrintElement);
printf("\n");
printf("后序遍历二叉树:\n");
PostOrderTraverse(T,PrintElement);
printf("\n");
}
课堂所学,留纪!