数据结构——二叉树的遍历

对二叉树的遍历进行实现的算法:
(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");

}
	

课堂所学,留纪!

上一篇:springfox-bridge:随心所欲地为非restful接口生成swagger api文档


下一篇:顺序栈