二叉樹的遍歷

所謂二叉樹的遍歷,就是按照某種次序訪問二叉樹中的每個節點,而且每個節點僅訪問一次的過程。以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;
}

我們採用兩種方式遍歷二叉樹,一種是遞歸方式,一種採用非遞歸方式(棧和隊列)。
運行程序:
這裏寫圖片描述
各種遍歷得到的結果如圖所示:
這裏寫圖片描述
至此二叉樹的遍歷就已經講完了,希望對大家有所幫助!

發佈了74 篇原創文章 · 獲贊 193 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章