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

匿名 (未验证) 提交于 2019-12-02 23:38:02

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

课堂所学,留纪!

文章来源: https://blog.csdn.net/weixin_43911280/article/details/91354895
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!