二叉樹的遞迴遍歷和層序遍歷(c c )

2021-10-02 15:11:18 字數 2522 閱讀 9432

二叉樹的三種遞迴遍歷為先序遍歷,中序遍歷和後續遍歷。它們相似之處在於都是對二叉樹的遞迴遍歷且對任何乙個結點都經過三次,區別之處在於哪一次對該結點進行訪問,由此分為先,中,後序遍歷。所以對於任一結點都有:三次經過,一次訪問。

先序遍歷:

僅以先序遍歷為例說明其思路。

當我們對二叉樹進行遍歷時,先對該結點內的資料進行訪問,然後依次遍歷它的左右孩子結點,遞迴進行直至結束。

例:對乙個有三個結點的二叉樹,包含根結點,左孩子結點和右孩子結點。先序遍歷的函式執行過程如下:(下面的字母和數字表示函式的執行步驟)

第一次函式呼叫:a,訪問根結點中的資料  b,遞迴呼叫左孩子結點   c,遞迴呼叫右孩子結點。

第二次函式呼叫左孩子結點 b:a,訪問左孩子結點內資料  b,遞迴呼叫左孩子結點的左孩子結點   c,遞迴呼叫左孩子結點的右孩子結點。

第三次函式呼叫左孩子的左孩子結點 b:該結點為空,不執行。返回第二次函式呼叫。

第四次函式呼叫左孩子的右孩子結點 c:該結點為空,不執行。返回第二次函式呼叫。第二次函式呼叫執行完畢,返回第一次函式呼叫中。

第五次函式呼叫右孩子結點 c:1,訪問右孩子結點內資料  2,遞迴呼叫右孩子結點的左孩子結點  3,遞迴呼叫右孩子結點的右孩子結點。

第六次函式呼叫右孩子的左孩子結點 2:該結點為空,不執行。返回第五次函式呼叫。

第七次函式呼叫右孩子的右孩子結點 3:該結點為空,不執行。返回第五次函式呼叫。第五次函式呼叫執行完畢,返回第一次函式呼叫。

第一次函式呼叫執行完畢。遞迴結束。

void preorder(btnode* p)

}

中序遍歷:

void inorder(btnode* p)

}

後序遍歷:

void postorder(btnode* p)

}

對於下圖中的樹:

先序遍歷結果為:abdecf   根   左   右

中序遍歷結果為:dbeafc   左   根   右

後序遍歷結果為:debfca   左   右   根

中序與先(後)序可唯一確定一顆二叉樹。

二叉樹的層序遍歷的實現思路:

建立乙個輔助資料結構佇列,在此採用大小為10的迴圈佇列。初始先將二叉樹根節點入隊,從而使得佇列不為空,接下來進入到迴圈中,當佇列不為空時,佇列中元素出隊,訪問出隊元素中的資料,並在出隊時將其左右孩子挨個入隊,每出隊乙個結點,將其左右孩子分別入隊,直至隊列為空,此時所有結點都被訪問過了。

void level(btnode* p)

if (que[front]->rc != null)}}}

關於樹的遍歷完整**如下:

#includetypedef struct btnode

btnode;

btnode* initial(char* ele, int num);//用陣列初始化一棵樹(預設建立一棵完全二叉樹)

void preorder(btnode* p);//先序遍歷

void inorder(btnode* p);//中序遍歷

void postorder(btnode* p);//後續遍歷

void level(btnode* p);//層序遍歷

int main()

; btnode* p = initial(data, 6);

cout << "先序遍歷: ";

preorder(p);

cout << endl;

cout << "中序遍歷: ";

inorder(p);

cout << endl;

cout << "後序遍歷: ";

postorder(p);

cout << endl;

cout << "層序遍歷: ";

level(p);

cout << endl;

return 0;

}btnode* initial(char* ele, int num)

i = 0;

while (i < num/2)//通過完全二叉樹的順序儲存來建立樹的結構 }

void inorder(btnode* p)

}void postorder(btnode* p)

}void level(btnode* p)

if (que[front]->rc != null)}}}

其中陣列中的輸入為下圖中的樹:

程式的輸出結果為:

二叉樹非遞迴遍歷可參考:

二叉樹層序遍歷 求二叉樹的層序遍歷

給定乙個二叉樹,返回該二叉樹層序遍歷的結果,從左到右,一層一層地遍歷 例如 給定的二叉樹是,該二叉樹層序遍歷的結果是 3 9,20 15,7 示例1 輸入 返回值 1 2 示例2輸入 返回值 1 2,3 4,5 解題思路 重點是如何把在一層的節點放到一起,設定乙個引數專門放一層的節點 class t...

層序遍歷二叉樹

要求 設計乙個演算法層序遍歷二叉樹 同一層從左到右訪問 我寫了乙個演算法 用乙個佇列儲存被訪問的當前節點的左右孩子以實現層序遍歷。status hierarchybitree bitree t,status visit telemtype e destroyqueue q 釋放佇列空間 return...

二叉樹層序遍歷

主要流程 確定root非空 根指標進佇列 佇列非空就一直迴圈 依次掃瞄目前佇列中所有元素 新增的不算 從佇列取出第一元素 將值放入結果vector中 判斷左右子節點非空,並依次入隊 將本次結果放入二維陣列中 如果需要按層逆序輸出的話,在這裡將二維結果倒排一下 返回二維結果 vector levelo...