二叉树的遍历
前言:
学校里只开了c++和Java的课并没有开c,但因为刚学完了严蔚敏老师的《数据结构(c语言版)》(清华大学出版社)心血来潮把c简单学了一遍并将基本的数据结构用c语言代码的形式重写一遍,希望和大家一起学习,也希望有错误或还能优化的地方大家能指出。
结构体:
typedef struct BiNode{
int Data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
建立二叉树:
BiTree CreateBiTree(BiTree T)
{
int data;
scanf("%d",&data);
if(data == -1){
T = NULL;
}
else{
T = (BiTree)malloc(sizeof(BiNode));
T->Data = data;
T->lchild = CreateBiTree(T->lchild);
T->rchild = CreateBiTree(T->rchild);
}
return T;
}
前序遍历:
void PreOrderTraverse(BiTree T)
{
if(T){
printf("%d ",T->Data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
中序遍历:
void InOrderTraverse(BiTree T)
{
if(T){
InOrderTraverse(T->lchild);
printf("%d ",T->Data);
InOrderTraverse(T->rchild);
}
}
后序遍历
void PostOrderTraverse(BiTree T){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%d ",T->Data);
}
}
层次遍历(包括队列部分):
typedef struct QNode {
BiNode *Data[MAXSIZE];
int rear,front;
}QNode,*Queue;
//初始化队列
Queue InitQueue(Queue Q)
{
Q = (Queue)malloc(sizeof(QNode));
Q->front = Q->rear =0;
return Q;
}
//入队
void EnQueue(Queue Q,BiNode *n)
{
if(Q->rear == MAXSIZE-1){
printf("队列已满");
return;
}
Q->Data[Q->rear++] = n;
}
//出队
BiNode *DeQueue(Queue Q)
{
if(Q->front == Q->rear){
return NULL;
}
return Q->Data[Q->front++];
}
//判空
int IsEmpty(Queue Q)
{
if((Q->rear-Q->front)==0)return 1;
else return 0;
}
//层次遍历
void LevelOrderTraverse(BiTree T)
{
if(!T){
printf("树为空");
return;
}
Queue Q = InitQueue(Q);
EnQueue(Q,T);
while(IsEmpty!=1){
T = DeQueue(Q);
printf("%d ",T->Data);
if(T->lchild)
EnQueue(Q,T->lchild);
if(T->rchild)
EnQueue(Q,T->rchild);
}
return;
}
完整代码:
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
typedef struct BiNode{
int Data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
BiTree CreateBiTree(BiTree T)
{
int data;
scanf("%d",&data);
if(data == -1){
T = NULL;
}
else{
T = (BiTree)malloc(sizeof(BiNode));
T->Data = data;
T->lchild = CreateBiTree(T->lchild);
T->rchild = CreateBiTree(T->rchild);
}
return T;
}
//前序遍历
void PreOrderTraverse(BiTree T)
{
if(T){
printf("%d ",T->Data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T)
{
if(T){
InOrderTraverse(T->lchild);
printf("%d ",T->Data);
InOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%d ",T->Data);
}
}
typedef struct QNode {
BiNode *Data[MAXSIZE];
int rear,front;
}QNode,*Queue;
//初始化队列
Queue InitQueue(Queue Q)
{
Q = (Queue)malloc(sizeof(QNode));
Q->front = Q->rear =0;
return Q;
}
//入队
void EnQueue(Queue Q,BiNode *n)
{
if(Q->rear == MAXSIZE-1){
printf("队列已满");
return;
}
Q->Data[Q->rear++] = n;
}
//出队
BiNode *DeQueue(Queue Q)
{
if(Q->front == Q->rear){
return NULL;
}
return Q->Data[Q->front++];
}
//判空
int IsEmpty(Queue Q)
{
if((Q->rear-Q->front)==0)return 1;
else return 0;
}
//层次遍历
void LevelOrderTraverse(BiTree T)
{
if(!T){
printf("树为空");
return;
}
Queue Q = InitQueue(Q);
EnQueue(Q,T);
while(IsEmpty!=1){
T = DeQueue(Q);
printf("%d ",T->Data);
if(T->lchild)
EnQueue(Q,T->lchild);
if(T->rchild)
EnQueue(Q,T->rchild);
}
return;
}
int main()
{
BiTree T;
T = (BiTree)malloc(sizeof(BiNode));
T = CreateBiTree(T);
printf("前序遍历为:");
PreOrderTraverse(T);
printf("\n");
printf("中序遍历为:");
InOrderTraverse(T);
printf("\n");
printf("后序遍历为:");
PostOrderTraverse(T);
printf("层次遍历为:");
LevelOrderTraverse(T);
return 0;
}
刚考完研,学了408(数据结构、计算机组成原理、计算机网络、操作系统),想着把数据结构的代码重新敲一遍,加深印象。若有错误望大家能指正。