詳解二叉樹的遞歸遍歷與非遞歸遍歷

二叉樹的遍歷

    所謂二叉樹的遍歷,是指按某條搜索路徑訪問樹中的每個節點,使得每個節點均被訪問一次,而且僅被訪問一次。

    遍歷二叉樹需要決定對根節點N、左子樹L、右子樹R的訪問順序(按照先遍歷左子樹在遍歷右子樹的原則),常見的遍歷次序有先序(NLR)、中序(LNR)、後序(LRN)三種遍歷算法,這也是最常見的二叉樹遍歷算法。

   其中的“序”實際上就是根節點的訪問時機。

1. 二叉樹的數據結構

typedef struct BTNode{

    int data;       //保存節點中的值

    struct BTNode  *lchild;     //左孩子指針

    struct BTNode  *rchild;     //右孩子指針

}BTNode,*BiTree;

這裏我使用的比較適合基礎學者的二叉樹的存儲結構,不同的存儲結構,實現二叉樹操作的算法也會不同,因此要根據實際應用場合(樹的形態和需要進行的運算)來選擇合適的存儲結構。

不說廢話了,哈哈肯定把你急死了!

 

2.二叉樹的遞歸遍歷

1. 先序遍歷

 先序遍歷(PreOrder)的操作如下:

①首先若二叉樹爲空,則什麼也不做;否則,

  • 訪問根節點;
  • 先序遍歷左子樹;
  • 先序遍歷右子樹。

對應的遞歸算法如下:

void PreOrder(BiTree T){
    if(T!=NULL){
        visit(T);        //訪問跟結點
        PreOrder(T->lchild);    //訪問左子樹
        PreOrder(T->rchild);    //訪問右子樹
    }
}

這裏舉一個例子做說明吧(後面都是使用這個例子),例子二叉樹如下:

 這樣一來先序遍歷所得到的節點序列爲1 2 4 6 3 5.

 

2. 中序遍歷

中序遍歷(InOrder)的操作如下:

①首先若二叉樹爲空,則什麼也不做;否則,

  • 中序遍歷左子樹;
  • 訪問根節點;
  • 中序遍歷右子樹。

對應的遞歸算法如下:

void InOrder(BiTree T){
    if(T!=NULL){
        InOrder(T->lchild);//遞歸遍歷左子樹
        visit(T);//訪問根結點
        InOrder(T->lchild);//遞歸遍歷右子樹
        
    }
}

這樣一來中序遍歷所得到的節點序列爲2 6 4 1 3 5.

 

3. 後序遍歷

後序遍歷(PostOrder)的操作如下:

①首先若二叉樹爲空,則什麼也不做;否則,

  • 後序遍歷左子樹;
  • 後序遍歷右子樹;
  • 訪問根節點。

對應的遞歸算法如下:

void PostOrder(BiTree T){
    if(T!=NULL){
        PostOrder(T->lchild);//遞歸遍歷左子樹
        PostOrder(T->rchild);//遞歸遍歷左子樹
        visit(T);            //訪問根結點
    }
}

這樣一來後序遍歷所得到的節點序列爲6 4 2 5 3 1.

 

這是二叉樹結點的遞歸遍歷,實現起來比較簡單,很好地使用了遞歸的思想。

二叉樹的非遞歸遍歷在我的另一邊文章當中

連接如下:二叉樹的非遞歸遍歷

 

最後,送大家一句話:知識並不能爲我們帶來財富,但是能使我們有能力去創造財富。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章