這些天,有些作筆試題的朋友問我,關於數據結構二叉樹知道前序遍歷,中序遍歷,求後續遍歷的算法,雖然這種也挺簡單的,可是在剛大學的時候,剛學數據結構那會兒,我也是不會的……只會在紙上亂塗亂畫,唉,當年也是一個渣渣,如今趁有點空,在這總結一下,後邊有朋友問到能夠直接過來看個人文章就好啦!
咱們先來回顧一下二叉樹的遍歷:算法
前序遍歷的「前」指的是根節點最前訪問,後邊中序遍歷的「中」指的是根節點中間訪問,後序遍歷的「後」指的是根節點最後訪問。所以,前中後針對的對象是根節點。數據結構
前序遍歷spa
根節點對象
左子樹it
右子樹class
中序遍歷求職
左子樹二叉樹
根節點遍歷
右子樹im
後續遍歷
左子樹
右子樹
根節點
如今瞭解了前中後遍歷的一些特色,那麼咱們來看一個例子吧
已知:
前序遍歷: GDAFEMHZ
中序遍歷: ADEFGHMZ
求後序遍歷
首先,要先畫出這棵二叉樹,怎麼畫呢?根據上面說的咱們一步一步來……
先看前序遍歷,前序遍歷第一個必定是根節點,那麼咱們能夠知道,這棵樹的根節點是G,接着,咱們看中序遍歷中,根節點必定是在中間訪問的,那麼既然知道了G是根節點,則在中序遍歷中找到G的位置,G的左邊必定就是這棵樹的左子樹,G的右邊就是這棵樹的右子樹了。
咱們根據第一步的分析,大體應該知道左子樹節點有:ADEF,右子樹的節點有:HMZ。同時,這個也分別是左子樹和右子樹的中序遍歷的序列。
在前序遍歷遍歷完根節點後,接着執行前序遍歷左子樹,注意,是前序遍歷,什麼意思?就是把左子樹當成一棵獨立的樹,執行前序遍歷,一樣先訪問左子樹的根,由此能夠獲得,左子樹的根是D,第2步咱們已經知道左子樹是ADEF了,那麼在這一步獲得左子樹的根是D,請看第4步。
從第2步獲得的中序遍歷的節點序列中,找到D,發現D左邊只有一個A,說明D的左子樹只有一個葉子節點,D的右邊呢?咱們能夠獲得D的右子樹有EF,再看前序遍歷的序列,發現F在前,也就是說,F是先前序遍歷訪問的,則獲得E是F的左子樹,只有一個葉子節點。
到這裏,咱們能夠獲得這棵樹的根節點和左子樹的結構了。以下圖:
接着看右子樹,在第2步的右子樹中序遍歷序列中,右子樹是HMZ三個節點,那麼先看前序遍歷的序列,先出現的是M,那麼M就是右子樹的根節點,恰好,HZ在M的左右,分別是它的左子樹和右子樹,所以,右子樹的結構就出來了:
到這裏,咱們能夠獲得整棵樹的結構:
基本上,按照上面說的一步一步來,知道前序遍歷和中序遍歷求後序遍歷就變得很是簡單了,今天花點時間記錄下來,一方面是作一下知識的回顧,第二點是但願能夠幫助到有須要的朋友,如今也是求職高峯期,常常會在筆試題中遇到相似的東西,不少時候都是考到一些平時不怎麼注意的細節。