二叉树的遍历
本文主要介绍二叉树的四种遍历,分别是前序遍历(先序遍历),中序遍历,后序遍历,层次遍历
前序(先序)遍历的递归算法
void PreOrder(BiTree root) //先序遍历二叉树
{
if(root!=NULL)
{
printf("%c",root->data);
PreOrder(root->LChild);
PreOrder(root->RChild);
}
}
中序遍历的非递归算法
void InOrder(BiTree root) //中序遍历二叉树
{
if(root!=NULL)
{
InOrder(root->LChild);
printf("%c",root->data);
InOrder(root->RChild);
}
}
后序遍历的非递归算法
void PostOrder(BiTree root) //后序遍历二叉树
{
if(root!=NULL)
{
PostOrder(root->LChild);
PostOrder(root->RChild);
printf("%c",root->data);
}
}
层次遍历
void LevelTraverse(BiTree T)
{
BiTNode *qu[MAXSIZE];
int front, rear;
front = rear = 0;
if(T!=NULL)
printf("%c", T->data);
rear++;
qu[rear] = T;
while(rear!= front)
{
front = (front +1)%MAXSIZE;
T = qu[front];
if(T->LChild != NULL)
{
printf("%2c", T->LChild->data);
rear = (rear + 1)%MAXSIZE;
qu[rear] = T->LChild;
}
if(T->RChild != NULL)
{
printf("%2c", T->RChild->data);
rear = (rear + 1)%MAXSIZE;
qu[rear] = T->RChild;
}
}
printf("\n");
}
最后附上代码
#include <stdio.h>
#include <stdlib.h>
typedef char DataType;
#define MAXSIZE 100
typedef struct Node
{
DataType data;
struct Node *LChild;
struct Node *RChild;
} BiTNode,*BiTree; //定义二叉树
void CreateBiTree(BiTree *bt) //用先序遍历创建二叉树
{
char ch;
ch=getchar();
if(ch=='.')
(*bt)=NULL;
else
{
*bt=(BiTree)malloc(sizeof(BiTNode));
(*bt)->data=ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
}
}
void PreOrder(BiTree root) //先序遍历二叉树
{
if(root!=NULL)
{
printf("%c",root->data);
PreOrder(root->LChild);
PreOrder(root->RChild);
}
}
void InOrder(BiTree root) //中序遍历二叉树
{
if(root!=NULL)
{
InOrder(root->LChild);
printf("%c",root->data);
InOrder(root->RChild);
}
}
void PostOrder(BiTree root) //后序遍历二叉树
{
if(root!=NULL)
{
PostOrder(root->LChild);
PostOrder(root->RChild);
printf("%c",root->data);
}
}
void LevelTraversal(BiTree T)
{
BiTNode *qu[MAXSIZE];
int front, rear;
front = rear = 0;
if(T!=NULL)
printf("%c", T->data);
rear++;
qu[rear] = T;
while(rear!= front)
{
front = (front +1)%MAXSIZE;
T = qu[front];
if(T->LChild != NULL)
{
printf("%2c", T->LChild->data);
rear = (rear + 1)%MAXSIZE;
qu[rear] = T->LChild;
}
if(T->RChild != NULL)
{
printf("%2c", T->RChild->data);
rear = (rear + 1)%MAXSIZE;
qu[rear] = T->RChild;
}
}
printf("\n");
}
void main()
{
BiTree bt;
printf("用先序遍历创建二叉树 请输入树的内容 形式如AB..CD...的格式\n") ;
CreateBiTree(&bt);
PreOrder(bt);
printf("\n");
InOrder(bt);
printf("\n");
PostOrder(bt);
printf("\n");
LevelTraversal(bt);
}