欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言实现数据结构-----树的遍历

程序员文章站 2022-06-18 20:22:35
...

树的先序,中序,后序,递归遍历,中序非递归遍历

树的遍历

  • 先序
    (先根再左再右)
    -中序
    (先左再根再右)
    -后序
    (先左再右再根)
    C语言实现数据结构-----树的遍历
    代码实现:

```c
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define STACK_INIT_SIZE 10//储存空间初始量 
#define STACKINCREMENT 2
#define OK 1
#define ERROR 0
#define MAX_TREE_SIZE 100

typedef char TElemType;
typedef int Status;
typedef TElemType SqBiTree[MAX_TREE_SIZE];

typedef struct BiTNode {
	TElemType data;
	struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;

typedef BiTree SElemType;
struct SqStack {
	SElemType *base;// zhandi
	SElemType *top;//zhanding
	int stacksize;//已分配的储存空间
};
Status InitStack(SqStack &S) {
	//构造一个空栈
	if(!(S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType))))exit(OVERFLOW);
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;

}
Status StackEmpty(SqStack S) {
	//若栈为空则TRUE
	if(S.top==S.base)return TRUE;
	else return FALSE;

}
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;
}

Status Pop(SqStack &S,SElemType &e) {
	//若栈不空,则删除s的栈顶元素,用e返回其值和OK
	if(S.top==S.base) return ERROR;
	e=*--S.top;
	return OK;
}
//abc##de#g##f###
//Status InitBiTree(BiTree &T) {//节点初始化
//	T = (BiTNode*)malloc(sizeof(BiTNode));//malloc()的返回值可以强制类型转换
//	T -> lchild = NULL;
//	T -> rchild = NULL;
//	printf("请以先序的方式键入二叉树节点信息。\n");
//}

Status CreatBiTree(BiTree &T) {
	TElemType 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;

}
Status PreOrderTraverse(BiTree T,Status(* Visit)(TElemType e)) {
//采用二叉链表存储结构,Visit是对数据元素操作的应用函数
	if(T) {
		if(Visit(T->data))
			if(PreOrderTraverse(T->lchild,Visit))
				if(PreOrderTraverse(T->rchild,Visit))
					return OK;
		return ERROR;
	} else {
		return OK;
	}
}//递归先序

Status InOrderTraverse(BiTree T,Status(* Visit)(TElemType e)) {
//采用二叉链表存储结构,Visit是对数据元素操作的应用函数
	if(T) {

		if(InOrderTraverse(T->lchild,Visit))
			if(Visit(T->data))
				if(InOrderTraverse(T->rchild,Visit))
					return OK;
		return ERROR;
	} else {
		return OK;
	}
}//递归中序

Status PosOrderTraverse(BiTree T,Status(* Visit)(TElemType e)) {
//采用二叉链表存储结构,Visit是对数据元素操作的应用函数

	if(T) {
		if(PosOrderTraverse(T->lchild,Visit))
			if(PosOrderTraverse(T->rchild,Visit))

				if(Visit(T->data))
					return OK;
		return ERROR;
	} else {
		return OK;
	}
}//递归后序

Status InOrderTraverse2(BiTree T,Status(* Visit)(TElemType e)) {
	SqStack S;
	InitStack(S);
	BiTree p=T;
	while(p||!StackEmpty(S)) {
		if(p) {
			Push(S,p);
			p=p->lchild;
		} else {
			Pop(S,p);
			if(!Visit(p->data))
				return ERROR;
			p=p->rchild;
		}
	}
	return OK;
}//中序非递归

Status PrintElement(TElemType e) {
	printf("%c",e);
	return OK;
}
void Test(BiTree &T) {
	printf("先序键入二叉树结点信息,(# 表示空):");
	CreatBiTree(T);
	printf("\n先序递归实现:");
	PreOrderTraverse(T,PrintElement);
	printf("\n中序递归实现:");
	InOrderTraverse(T,PrintElement);
	printf("\n后序递归实现:");
	PosOrderTraverse(T,PrintElement);
	printf("\n中序非递归实现:");
	InOrderTraverse2(T,PrintElement);
}
int main() {
	BiTree T;
	Test(T);
	getchar();

}

结果:

C语言实现数据结构-----树的遍历