二叉樹遍歷的定義 |
二叉樹的遍歷:按一定規律對二叉樹中的每個結點進行訪問且僅訪問一次。其中的訪問可指計算二叉樹中結點的數據信息,打印該結點的信息,也包括對結點進行任何其他操作。
爲什麼需要遍歷二叉樹?
二叉樹是非線性數據結構,通過遍歷可以將二叉樹中的結點訪問一次且僅一次,從而得到訪問結點的順序序列。從這個意義上說,遍歷操作就是將二叉樹中結點按一定規律線性化的操作,目的在於將非線性化結構變成線性化的訪問序列。
二叉樹遍歷的規律及相關遞歸遍歷算法 |
先序遍歷 |
(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)