二叉树的深度优先和广度优先遍历
圖的深度優先搜索法是樹的先根遍歷的推廣,它的基本思想是:從圖G的某個頂點v0出發,訪問v0,然后選擇一個與v0相鄰且沒被訪問過的頂點vi訪問,再從vi出發選擇一個與vi相鄰且未被訪問的頂點vj進行訪問,依次繼續。如果當前被訪問過的頂點的所有鄰接頂點都已被訪問,則退回到已被訪問的頂點序列中最后一個擁有未被訪問的相鄰頂點的頂點w,從w出發按同樣的方法向前遍歷,直到圖中所有頂點都被訪問。
圖的廣度優先搜索是樹的按層次遍歷的推廣,它的基本思想是:首先訪問初始點vi,并將其標記為已訪問過,接著訪問vi的所有未被訪問過的鄰接點vi1,vi2, …, vi t,并均標記已訪問過,然后再按照vi1,vi2, …, vi t的次序,訪問每一個頂點的所有未被訪問過的鄰接點,并均標記為已訪問過,依次類推,直到圖中所有和初始點vi有路徑相通的頂點都被訪問過為止。
二叉樹的深度優先遍歷的非遞歸的通用做法是采用棧,廣度優先遍歷的非遞歸的通用做法是采用隊列。
深度優先遍歷分為三種:前序,中序,后序。
?
首先我們知道,前序遍歷的規則是:
根結點→左子結點→右子結點
中序遍歷是:左子結點→根結點→右子結點
后序遍歷是:左子結點→右子結點→根結點
已知某二叉樹的前序是abdgcefh,中序dgbaechf,則后序是?
那么,對于一棵二叉樹,前序遍歷的第一個結點一定是這棵樹的根結點,即根結點是a。
在中序遍歷的順序dgbaechf中,以a分成左、右兩邊,左邊是bdg,右邊是echf。
所以,這棵樹現在可以確定如下:
a
/ \?
bdg echf
接下來再分別對左子樹和右子樹進行類似的操作。
對于左子樹dgb來說,在前序遍歷abdgcefh中找到bdg,證明這子樹的根是b,那么現在可以確定的樹結構如下:
a
/ \
b echf
/
dg
再看dg,前序遍歷中的順序為dg,所以d是dg這部分子樹的根,那么又因為中序遍歷的dg順序也是dg,所以g是右子結點。
即:
a
/ \
b echf
/
d
\
g
現在看echf這部分子樹,前序中順序是cefh,所以子樹根結點是c,那么左子結點是e,右子樹是hf:
得到:
a
/ \
b c
/ / \
d e hf
\
g
最后只剩下hf部分了,前序遍歷中是fh,所以根是f,那么h就是左子結點。
現在得到了整棵樹:
a
/ \
b c
/ / \
d e f
\ /
g h
對這棵樹再進行后序遍歷就行了,結果就是:DGEBHFCA
?
???????? A
??
????? B???????? C
D??????? E???????? F
????? G????????? H
?
?
二叉樹的排序的閱讀方式:
?
轉載于:https://www.cnblogs.com/songQQ/archive/2009/10/20/1587126.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的二叉树的深度优先和广度优先遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#实现HTTP协议:多线程文件传输
- 下一篇: 忆