【樹】二叉樹的遍歷及遞歸遍歷算法

二叉樹遍歷的定義

二叉樹的遍歷:按一定規律對二叉樹中的每個結點進行訪問且僅訪問一次。其中的訪問可指計算二叉樹中結點的數據信息,打印該結點的信息,也包括對結點進行任何其他操作。

爲什麼需要遍歷二叉樹?
二叉樹是非線性數據結構,通過遍歷可以將二叉樹中的結點訪問一次且僅一次,從而得到訪問結點的順序序列。從這個意義上說,遍歷操作就是將二叉樹中結點按一定規律線性化的操作,目的在於將非線性化結構變成線性化的訪問序列。

二叉樹遍歷的規律及相關遞歸遍歷算法

在這裏插入圖片描述

先序遍歷

(1)先序遍歷(DLR)操作過程
若二叉樹爲空,則空操作,否則依次執行如下 3 個操作:
① 訪問根結點;
② 按先序遍歷左子樹;
③ 按先序遍歷右子樹。

void PreOrder(BiTree root)
/*先序遍歷二叉樹, root 爲指向二叉樹(或某一子樹)根結點的指針*/
{
    if (root != NULL)
    {
        Visit(root->data);      /*訪問根結點*/
        PreOrder(root->LChild); /*先序遍歷左子樹*/
        PreOrder(root->RChild); /*先序遍歷右子樹*/
    }
}
中序遍歷

(2)中序遍歷(LDR)操作過程
若二叉樹爲空,則空操作,否則依次執行如下 3 個操作:
① 按中序遍歷左子樹;
② 訪問根結點;
③ 按中序遍歷右子樹。

void InOrder(BiTree root)
/*中序遍歷二叉樹, root 爲指向二叉樹(或某一子樹)根結點的指針*/
{
    if (root != NULL)
    {
        InOrder(root->LChild); /*中序遍歷左子樹*/
        Visit(root->data);     /*訪問根結點*/
        InOrder(root->RChild); /*中序遍歷右子樹*/
    }
}
後序遍歷

(3)後序遍歷(LRD)操作過程
若二叉樹爲空,則空操作,否則依次執行如下 3 個操作:
① 按後序遍歷左子樹;
② 按後序遍歷右子樹;
③ 訪問根結點。

void PostOrder(BiTree root)
/* 後序遍歷二叉樹,root 爲指向二叉樹(或某一子樹)根結點的指針*/
{
    if (root != NULL)
    {
        PostOrder(root->LChild); /*後序遍歷左子樹*/
        PostOrder(root->RChild); /*後序遍歷右子樹*
 Visit(root ->data); /*訪問根結點*/
    }
}

遞歸算法的時間複雜度分析:設二叉樹有 n 個結點,對每個結點都要進行一次入棧和出棧的
操作,即入棧和出棧各執行 n 次,對結點的訪問也是 n 次。這些二叉樹遞歸遍歷算法的時間
複雜度爲 O(n)

在這裏插入圖片描述在這裏插入圖片描述

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