先序:根、左、右
中序:左、根、右
後序:左、右、根
話不多說,直接上題:
先序:abcdefghijkl
中序:cbefdgajiklh
第一步:找到根節點
很容易:先序序列的第乙個訪問的就是根節點,後序序列訪問的最後乙個是根節點,
很容易的找到該題老父親根節點為a
第二步:根據根節點確定左右子樹,也就是根節點的兩個孩子及其後代。
我們首先確定一件事,題目要你根據序列求二叉樹,一定是給你了中序序列,如果不給,則無法確定二叉樹。
根據中序序列,我們確定根節點左邊的都是左邊的後代,也就是大哥及其後代們:cbefdg
根節點右邊的是二弟及其後代們:jiklh
我們根據第二步可以確定這棵樹為下圖所示的樣子
可以清楚的看到,我們經過這兩步簡單的劃分,把這些節點大致分了類
第三步:填補細節
我提供我的方法:找到在兩個序列中都連續的節點,建議三個一組或四個一組的找。
先序中的def和中序中的efd。
注意:我這裡說的連續並不是指abcd這種連續,而是在兩個序列中一起出現的那種連續
如果你這時候說cbefdg和bcdefg不也是連續的嗎。那我只能說:你開心就好,但路要一步一步走,飯要一口一口吃,步子邁大了,容易扯著蛋,飯一口吃多了,容易卡喉嚨
回到正題,我們要做的就是先拆散,再集合。選擇的個數越少越容易。
我們先看先序的ef和中序的ef這個顯而易見的相同的順序,根據先序的根左右和中序的左根右,判斷出來e是f的爹,f是e的右孩子而且e也只有他乙個孩子,也就是這個樣子
再確定d的位置,由於在先序中,d在e的前面,所以d肯定是e的父親,至於e是d的左孩子還是右孩子,試一下就知道了
我們首先看這種情況:e為d的右孩子
此時我們得到的先序序列是:def,中序:def,是不是和題目不一樣啊,所以這個畫法是錯誤的,但是這個錯誤的畫法給我們提供的乙個模板,那就是如果中序和先序序列一樣,那麼這些點就是按上圖所示的連線起來的,全是右孩子
第二種情況,e為d的左孩子
這時得到的先序:def,中序:dfe和題目相符。所以,d、e、f的連線方式應該是上圖所示。
其實我們也可以先畫出左邊的連線方式,根據中序,確定最左邊的那個孩子為c,再根據先序根a到c之間的所有節點都能連成一條直線:根據先序的根左、根左順序,一直畫到底,也就是這樣:
這個是最容易畫的,也應該是最先做的,畫起來是最爽的。
我們現在只有g和d的位置不確定了。再根據先序,遍歷完c之後的第乙個就是d,那麼d一定是b的右孩子了,那麼d就很容易的接上去:
那麼g的位置在哪我就不用多說了吧?
此時我們再來看一下之前得到的乙個結論:如果中序和先序序列一樣,那麼這些點就是按上圖所示的連線起來的,全是右孩子,看看bdg在先序和中序中的順序,是不是b永遠在d的前面,d永遠在g的前面啊,他們連成了一條線,其實這東西我也說不清楚,你們自己多做幾道題就能看明白了,我只是給你們提供一些方法,
我們再來畫右邊的圖,先序遍歷完左邊的節點後,往右邊遍歷的第乙個節點就是h,那麼h一定是a的右孩子
利用上面提到的結論:kl在兩個序列中的都是連在一起而且順序也都是一樣的,那麼他們一定是這樣的關係
i、j在兩個序列中連在一起,但是順序相反,那麼他們一定是這樣的
這下總根右邊的節點都大致連了一遍,剩下就很簡單了。
先序中h之後的節點是i,那麼i是h的左孩子,或者右孩子(只有右孩子)
而在中序中,h是最後訪問的,那麼i只能是h的左孩子,而且h只有左孩子
那麼現在只剩k的連線位置了,k要麼是i的右孩子,要麼是j的左孩子或者右孩子。
最簡單是方法:試一下就知道了
我懶得試,直接用上面的方法:在中序和先序中,i、k、l的先後順序是不變的,那麼說明了什麼問題?
他三在同一直線上啊!!!
寫了這麼多我也不知道你們看懂沒,沒看懂的就照著畫一下,多畫幾下就明白了。我寫的很迷,整體過程也有些問題,但是我懶得改了,大致上還是能解決問題了
好了,就寫到這裡吧。什麼?你問我不是兩道例題嗎?是啊,但是我不知道乙個題就寫了我這麼久,太費時間了,以後有時間再寫後序和中序的。
SDU week2作業 BFS 的兩道例題
題目 東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。input 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。ou...
兩道baidu試題
1 簡述 n個空間,存放a到a n 1的數,位置隨機且數字不重,a為正且未知,現在第乙個空間的數被誤設定為 1。說明 已經知道被修改的數不是最小的。例子 n 6,a 2,原始的串為5,3,7,6,2,4。現在被別人修改為 1,3,7,6,2,4。現在希望找到5。思路 充分利用等差數列性質。法一 開一...
兩道筆試題
昨天一朋友找工作,碰到兩道演算法筆試題,都是當於鍊錶操作的.原題具體的還原不過來了,不過大致是 1.有一單鏈表,找出最後第m個節點.昨天看到問題時,想到了小學應用題 汽車過山洞,假如這個汽車開著開著,等到車頭剛要出山洞,車尾離山洞出口也有一段距離嘛.這樣,這個題方法出來了 cpp node find...