已知二叉樹的遍歷序列去還原二叉樹的超好用方法分析

今天記錄一下之前學習二叉樹時有關由遍歷序列求原二叉樹的好辦法
例:已知二叉樹的先序遍歷序列是AEFBGCDHIKJ,中序遍歷序列是EFAGBCHKIJD,畫出此二叉樹

我一開始做這些題目的時候也都是得試個幾遍,但是後來隨着做題數量的慢慢增加,我發現之前的“試幾遍”其實是沒有參悟二叉樹遞歸的本質,以及各種遍歷序列的特點,那麼下面我和大家來看看先序遍歷序列+中序遍歷序列推二叉樹的快速方法(一次過把二叉樹準確畫出來)

我們知道:先序遍歷的順序是 根->左->右;中序遍歷的順序是 左->根->右
所以由先序遍歷序列我們可以立刻確定根節點,那麼在中序遍歷序列中,我們定位這個找出來的根節點,該結點以左就是它的左子樹,該結點以右就是它的右子樹(這個性質不只是對根節點適用,同時也適用於其他父結點),所以我們利用這樣的性質遞歸地構建好原來的二叉樹

好的,我們開始解題吧:
第一步:
下圖中第一行的序列是先序序列,第二行是中序序列
已知二叉樹的遍歷序列去還原二叉樹的超好用方法分析


我們確定了A就是二叉樹的根節點,那麼我們再在第二行找到A,A以左(即E,F)就是A的左子樹,A以右(即GBCHKIJD)就是A的右子樹,然後我們來看看A左子樹的情況,由於先序遍歷是根左右,所以A完了之後的E一定是左子樹的根節點,那麼在第二行把E找到,則F必定是它的右子樹
好的,整個左子樹完成啦,下面看看右邊這一大塊怎麼搞:
已知二叉樹的遍歷序列去還原二叉樹的超好用方法分析

由於剛剛我們知道E,F組成了該二叉樹的右子樹,所以在EF遍歷完了之後,先序遍歷就應該開始遍歷右子樹啦,所以B就是右子樹的根節點了,同樣的在中序遍歷序列中定位B,以B爲基準劃分,我們發現G是B的唯一的左孩子,那麼CHKIJD就是B結點的右子樹了,看看,問題是不是通過遞歸的方式慢慢變得簡化起來了?
我們繼續看看B的右子樹怎麼搞?
已知二叉樹的遍歷序列去還原二叉樹的超好用方法分析
G遍歷完,那麼先序遍歷就應該到了B的右子樹了,那麼很顯然,C即是B右子樹的根節點,同樣的方法,我們在中序遍歷序列中找到C並且劃分左右子樹,我們發現C沒有左子樹,如上圖的紅色線所示HKIJD全部都是C的右子樹,很好,那麼我們就立刻鎖定C右子樹的根節點:D,劃分,有趣的是,D結點沒有右子樹,只有左子樹,那麼現在,我們的問題就變成了找HKIJ的排列方式了


堅持一下,我們已經看到勝利的曙光了!!
已知二叉樹的遍歷序列去還原二叉樹的超好用方法分析
那麼H就一定是D的左子樹的根節點,劃分,發現H也只有右子樹,那麼I必定是H的右子樹的根節點,劃分,則K爲I的左孩子,J爲I的右孩子

至此,整個二叉樹被我們順利還原啦!!

但是有一點需要說明一下:如果是已知先序遍歷和後序遍歷是不能唯一確定一顆二叉樹的,但是其他序列的組合是可以的。

注:今天看到一位大佬寫的還原二叉樹的方法很清晰,因爲是不同的平臺,所以只能把整篇文章拷貝過來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章