層序遍歷意思就是按照從上往下,從左往右的順序遍歷二叉樹的元素。
實現二叉樹的層序遍歷需要用到二叉樹和佇列。
總體思路:
判斷當前佇列是否為空
隊列為空:結束。佇列非空:取出佇列第乙個元素
將取出的元素的兩個子節點依次入隊
用自定義的initq函式建立乙個空佇列;
隨後我們將二叉樹的根節點(比如這裡是3)放入佇列,這裡入隊需要使用尾插法來滿足佇列的「先進先出」的規則;
判斷當前佇列是否為空,因為我們存入了3,所以現在佇列是,不為空,繼續下一步;
取出頭部第乙個元素,也就是3,然後把3的兩個子節點(9和20)放入佇列,現在的佇列是【9、20】
遞迴:判斷佇列是否為空,因為有9和20,所以不為空,取出第乙個元素也就是9,把9的子節點入隊,由於9的子節點都是null,所以現在佇列是
現在佇列不為空,取出20,把20的子節點依次入隊,佇列變為【15,7】
取出15,存入15的子節點,佇列變為
取出7,存入7的子節點,隊列為空,結束。
得到層序遍歷結果:3,9,20,15,7
3個結構體:
treenode:表示二叉樹的節點,裡面有資料data,指向左右孩子的指標left和right;
queue:表示一條佇列,有front和rear,分別指向佇列的頭和尾。注意:佇列包含了乙個空的頭結點。
5個函式:
initq:作用是建立乙個佇列。這個佇列只有乙個節點,這個節點沒有存data,它的next是null;
createtree:作用是建立乙個二叉樹。
用遞迴方式建立乙個二叉樹,需要按照前序手動輸入每個節點的元素。如果某個節點沒有左右子節點,需要輸入*表示null;
enqueue:作用是把二叉樹的元素取出放入佇列。
這個函式會讓之前建立的空佇列中新建乙個節點接在之前空節點的後面,注意是用尾插法,新的節點是放在最後。新建節點之後把二叉樹的元素放入剛剛建好的節點中。更新佇列的rear,始終保持rear指向佇列的最後乙個節點。
新建節點按照「先右後左」的順序與其他節點連線,先把新節點的next(右一項)連到null,再把新節點的前驅的next連到新節點。
dequeue:作用是刪除佇列第乙個節點。
要分類討論,依據佇列中節點的數量(不包括initq建立的空的頭結點)分類
當佇列中節點數量大於1時:front右移一位,釋放佇列中front移動之前節點的記憶體;
當佇列只有1個節點時:將rear向左移動一位,釋放記憶體。
整體**:
#include
#include
#include
//層序遍歷二叉樹
typedef
struct treenode//樹節點
treenode,
* ptreenode;
typedef
struct queuenode//佇列節點
queuenode,
* pqueuenode;
typedef
struct queue//佇列
queue,
* pqueue;
void
createtree
(ptreenode& t)
//建立樹,&引用已經定義的t
else
}pqueue initq
(pqueue pq)
//建立只有頭結點的佇列
else
}void
enqueue
(pqueue pq, ptreenode t)
//把二叉樹的資料取出放入佇列
ptreenode dequeue
(pqueue pq)
//出隊:刪除佇列第乙個元素
else
ptreenode x;
x= ptemp->data;
//x為佇列第乙個元素的data
free
(ptemp)
;return x;
}void
levelorderbitree
(ptreenode t)
//層序輸出
if(x->right!=
null)}
}int
main()
二叉樹層序遍歷 求二叉樹的層序遍歷
給定乙個二叉樹,返回該二叉樹層序遍歷的結果,從左到右,一層一層地遍歷 例如 給定的二叉樹是,該二叉樹層序遍歷的結果是 3 9,20 15,7 示例1 輸入 返回值 1 2 示例2輸入 返回值 1 2,3 4,5 解題思路 重點是如何把在一層的節點放到一起,設定乙個引數專門放一層的節點 class t...
二叉樹的層序遍歷(c語言)
ps 2018 7 15 自己花了一晚上的時間寫的二叉樹的層序遍歷,但是感覺有點小瑕疵,各位大佬幫忙看看 moni.h ifndef moni h define moni h struct cenxu struct queue typedef struct cenxu abc typedef str...
層序遍歷二叉樹
要求 設計乙個演算法層序遍歷二叉樹 同一層從左到右訪問 我寫了乙個演算法 用乙個佇列儲存被訪問的當前節點的左右孩子以實現層序遍歷。status hierarchybitree bitree t,status visit telemtype e destroyqueue q 釋放佇列空間 return...