所謂二叉樹的遍歷,就是按照某種次序訪問二叉樹中的每個節點,而且每個節點僅訪問一次的過程。以L、N、R分別表示遍歷左子樹、訪問根節點、遍歷右子樹,則可有NLR、LRN、NRL、RNL、RLN等6中遍歷方式。若限定先左後右,則只有三種遍歷,分別成爲先序遍歷、中序遍歷和後序遍歷,另外還有一種按層序的遍歷方式。下面我們採用一個例子來完成的描述二叉樹的遍歷過程:
這是一個遞歸生成的二叉樹,’#’表示節點爲空。
#include<iostream>
#include<cstdlib>
#define MaxSize 30
using namespace std;
typedef char ElementType;
typedef struct node
{
ElementType data;
struct node *lchild;
struct node *rchild;
}BTNode;
void CreateBTree(BTNode* &T){
//按先序輸入二叉樹中結點的值(一個字符),空格字符代表空樹,
//構造二叉樹表表示二叉樹T。
char ch;
if((ch=getchar())=='#')T=NULL;//其中getchar()爲逐個讀入標準庫函數
else{
T=(BTNode*)malloc(sizeof(BTNode));//產生新的子樹
T->data=ch;//由getchar(A)逐個讀入來
CreateBTree(T->lchild);//遞歸創建左子樹
CreateBTree(T->rchild);//遞歸創建右子樹
}
}//CreateTree
void PreOrder(BTNode *b)
{
if(b!=NULL)
{
cout<<b->data<<" ";
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
//先序非遞歸算法
void PreOrder1(BTNode *b)
{
BTNode *St[MaxSize],*p;
int top=-1;
if(b!=NULL)
{
top++;
St[top]=b;
while(top!=-1)
{
p=St[top];
top--;
cout<<p->data<<" ";
if(p->rchild!=NULL)
{
top++;
St[top]=p->rchild;
}
if(p->lchild!=NULL)
{
top++;
St[top]=p->lchild;
}
}
cout<<endl;
}
}
//中序非遞歸算法
void InOrder1(BTNode *b)
{
BTNode *St[MaxSize],*p;
int top=-1;
if(b!=NULL)
{
p=b;
while(top>-1||p!=NULL)
{
while(p!=NULL)
{
top++;
St[top]=p;
p=p->lchild;
}
if(top>-1)
{
p=St[top];
top--;
cout<<p->data<<" ";
p=p->rchild;
}
}
cout<<endl;
}
}
void InOrder(BTNode *b)
{
if(b!=NULL)
{
InOrder(b->lchild);
cout<<b->data<<" ";
InOrder(b->rchild);
}
}
void PostOrder(BTNode *b)
{
if(b!=NULL)
{
PostOrder(b->lchild);
PostOrder(b->rchild);
cout<<b->data<<" ";
}
}
//後序遞歸算法
void PostOrder1(BTNode *b)
{
BTNode *St[MaxSize];
BTNode *p=b,*q;
int flag,top=-1;
if(b!=NULL)
{
do
{
while(p!=NULL)
{
top++;
St[top]=p;
p=p->lchild;
}
q=NULL;
flag=1;
while(top!=-1&&flag==1)
{
p=St[top];
if(p->rchild==q)
{
cout<<p->data<<" ";
top--;
q=p;
}else
{
p=p->rchild;
flag=0;
}
}
}while(top!=-1);
cout<<endl;
}
}
//層序遍歷
void LevelOrder(BTNode *b)
{
BTNode *p;
BTNode *qu[MaxSize];
int front,rear;
front=rear=0;
rear++;
qu[rear]=b;
while(front!=rear)
{
front=(front+1)%MaxSize;
p=qu[front];
cout<<p->data<<" ";
if(p->lchild!=NULL)
{
rear=(rear+1)%MaxSize;
qu[rear]=p->lchild;
}
if(p->rchild!=NULL)
{
rear=(rear+1)%MaxSize;
qu[rear]=p->rchild;
}
}
}
int main()
{
BTNode *b;
CreateBTree(b);
cout<<"先序遍歷結果:"<<endl;
//PreOrder(b);
PreOrder1(b);
cout<<"中序遍歷結果:"<<endl;
//InOrder(b);
InOrder1(b);
cout<<endl;
cout<<"後序遍歷結果:"<<endl;
//PostOrder(b);
PostOrder1(b);
cout<<"層序遍歷結果:"<<endl;
LevelOrder(b);
return 0;
}
我們採用兩種方式遍歷二叉樹,一種是遞歸方式,一種採用非遞歸方式(棧和隊列)。
運行程序:
各種遍歷得到的結果如圖所示:
至此二叉樹的遍歷就已經講完了,希望對大家有所幫助!