劍指 Offer 07 重建二叉樹

2022-06-11 18:54:10 字數 2039 閱讀 4017

首先回憶下,用前序遍歷和中序遍歷一顆二叉樹:

1

/ \

2 3

/ \ / \

4 5 6 7

前序遍歷的結果是:[1,2,4,5,3,6,7]中序遍歷的結果是:[4,2,5,1,6,3,7]前序遍歷的特點是,根節點始終出現在陣列的第一位,而中序遍歷中根節點出現在陣列的中間位置。

根據上面給出的兩個陣列,首先我們就可以拼出根節點,它就是1

題目上已說明陣列中不存在重複元素,那麼由1就可以定位到中序陣列的中間位置,中序陣列中1左邊的部分就是左子樹,1右邊部分就是右子樹。

前序陣列怎麼切分呢?注意看下面這張圖,根節點是橘色,綠色部分是左子樹,藍色部分是右子樹。

前序陣列的左子樹部分+根節點1,2,4,5,中序陣列的左子樹部分+根節點4,2,5,1。這兩者的陣列長度是一樣的。

我們可以根據中序陣列的中間位置1,來確定前序陣列的左右部分,由於前序陣列第乙個是根節點,

所以其左邊部分是:[1:mid_index],右半部分是[mid_index+1:]

這裡的mid_index是中序陣列的中間下標位置。

遞迴函式實現如下:

終止條件:前序和中序陣列為空

根據前序陣列第乙個元素,拼出根節點,再將前序陣列和中序數組分成兩半,遞迴的處理前序陣列左邊和中序陣列左邊,遞迴的處理前序陣列右邊和中序陣列右邊。

動畫演示如下:

劍指offer07 重建二叉樹

這是乙個非常高頻的面試題。題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例子 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 思路 題目給出了前序和中序遍歷,我們可以知道前序的...

劍指 Offer 07 重建二叉樹

難度 中等 題目描述 解題思路 這道題之前做過,但是忘得乾乾淨淨了。現在再做一遍撿一撿,說不定哪次面試就出到了呢 總體思想就是遞迴,用雜湊表來儲存對應的中序遍歷的下標,空間換時間,免得每次都要去遍歷找下標。然後每次遞迴的時候,要給對應的左子樹和右子樹在對應陣列裡的下標,左端點大於右端點的時候返回空。...

劍指 Offer 07 重建二叉樹

首先要懂得前序遍歷和中序遍歷,可以寫出兩個陣列,自己手動來重建一下二叉樹,來看看重建二叉樹是怎麼乙個流程。以圖中給出的二叉樹為例,根據前序遍歷的特點,可知前序遍歷的首尾數字是根節點,比如這個時候根節點數值為3,可以在中序遍歷中第2個位置找到數值3,在3左邊的9為3的左子樹,右邊的15,20,7為右子...