已知前序遍歷和中序遍歷結果構造二叉樹(非遞迴解法)

2021-05-25 05:38:08 字數 1255 閱讀 6913

今天看到有人問及如何在已知前序遍歷和中序遍歷結果的情況下,重構整個二叉樹的問題,這裡寫出乙個個人的解法。

首先,在講解之前,我們先定義一種樹的表示方法,這裡以個人的方式給出一種: 根節點值(左節點標示,右節點表示)

據個例子,對於a為根節點,左節點b,右節點c的樹來說,結果為a(b,c)

當然,如果b,c各自還有子節點,那麼在原位置繼續擴充套件標示。

接著,複習一下所謂的前序遍歷,中序遍歷,後續遍歷:

其實,這三種方式記憶起來非常簡單,只要記住一點,就是三種方式都是以「根節點為基準「來說的。

據個例子:

對於a(b,c)這樣的樹

前序遍歷即根節點在前,結果為為abc

中序遍歷即根節點在中間, 結果為為bac

後續遍歷即根節點在最後,結果為bca

ps:當然,對於子節點來說,永遠都是先左右後。

可以看到,結果中,所謂的」前中後「都是對於根節點而言的。

具體遍歷方法,都可以用遞迴的定義給出。這裡以中序遍歷據個例子:

1.如果有左節點,中序遍歷左子節點

2.訪問當前節點

3.如果有右節點,中序遍歷右子節點

遞迴開始條件:當前節點為根節點

遞迴結束條件:訪問到葉節點,即左節點和右節點均為空的節點。

言歸正傳,簡單說一下如何解決題目的問題:

問題解決方式也就是利用結果的輸出特點,我們分析一下前序遍歷和中序遍歷的結果特點:

前序遍歷: 根節點+左節點前序遍歷結果+後節點前序遍歷結果

中序遍歷:左節點中序遍歷結果+根節點+右節點中序遍歷結果

很容易看出,利用前序遍歷可以直接知道根節點,利用中序遍歷,可以分割樹的左右節點集合。

同時,我們知道,無論哪種遍歷方式,左節點或者右節點的子樹中,節點個數是確定的。

由此我們可以得出如下結果:

1.利用前序遍歷知道根節點,即第乙個節點

2.利用已知的根節點,由中序遍歷可以分割左右子樹,同時得到左右子樹的中序遍歷結果

3.利用已知的左右子樹節點個數,再利用前序遍歷結果,可以分割出左右子樹的前序遍歷結果。

對於左右子樹,我們已經推出其各自的前序遍歷和中序遍歷結果,遞迴即可完成之後的操作。

同時,我們知道,所有的遞迴都可以用棧的方式轉換為非遞迴處理,所以最終的結果如下:

ps:這裡使用字元表示節點名稱,更多的是體現解法,效率並非最優。

測試結果:

preoder:edbachfg

inoder:abcdefgh

e(d(b(a,c),),h(f(,g),))

已知中序遍歷和後序遍歷,求前序遍歷

已知中序遍歷和後序遍歷,求前序遍歷 演算法的主要部分是將中序遍歷分成左中右三部分 將後序遍歷分成左右中三部分 最後後序建樹的時候節點就等於中間的部分 左子樹由中序遍歷的左部分和後序遍歷的左部分構建 右子樹由中序遍歷的右部分和後序遍歷的右部分構建 include include include inc...

已知後序遍歷和中序遍歷求前序遍歷

而已知後序遍歷和中序遍歷求前序遍歷的過程差不多,但由於後序遍歷是最後才訪問根節點的 所以要從後開始搜尋,例如上面的例子,後序遍歷為 gbdehfca,中序遍歷為 dgbaechf 後序遍歷中的最後乙個元素是根節點,a,然後查詢中序中a的位置 把中序遍歷分成 dgb a echf,而因為節點個數要對應...

LintCode 前序遍歷和中序遍歷樹構造二叉樹

根據前序遍歷和中序遍歷樹構造二叉樹.注意事項 你可以假設樹中不存在相同數值的節點 樣例給出中序遍歷 1,2,3 和前序遍歷 2,1,3 返回如下的樹 2 13 中序遍歷 遞迴遍歷當前節點的左子樹 當前節點 右子樹。後序遍歷 遞迴遍歷當前節點的左子樹 右子樹 當前節點。前序遍歷 遞迴遍歷當前節點的當前...