前往
大廳
主題

LeetCode - 105. Construct Binary Tree from Preorder and Inorder Traversal 解題心得

Not In My Back Yard | 2021-08-06 00:00:04 | 巴幣 0 | 人氣 254

題目連結:


題目意譯:
給定兩整數陣列 preorder 和 inorder ,其中 preorder 為一個二元樹之前序探訪(Preorder Traversal)而 inorder 為相同的二元樹之中序探訪(Inorder Traversal),請重建這棵二元樹並回傳它。

限制:
1 ≦ preorder.length ≦ 3000
inorder.length == preorder.length
-3000 ≦ preorder[i] 、 inorder[i] ≦ 3000
preorder 和 inorder 中的值皆相異。
每個 inorder 中的值同樣也出現於 preorder 中。
preorder 保證為該二元樹的前序探訪。
inorder 保證為該二元樹的中序探訪。



範例測資:
範例 1:
輸入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
輸出: [3,9,20,null,null,15,7]

範例 2:
輸入: preorder = [-1], inorder = [-1]
輸出: [-1]


解題思維:
我們可以根據前序、中序探訪的定義(可以參見這題的說明)。

例如範例測資 preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 。

可以看到節點值為 3 應為整棵樹的根節點,因為前序探訪的開頭為根節點。然後根據中序探訪節點值 9 的節點應屬於左子樹、節點值為 15 、 20 、 7 的節點應在右子樹。

因此我們可以遞迴地去建立左子樹 preorder = [9] 、 inorder = [9] 以及右子樹 preorder = [20,15,7] 、 inorder = [15,20,7] 。最後便可以重建出整棵樹。



此外,除了給定前序以及中序探訪的序列可以重建原本的二元樹之外,給定中序和後序探訪也可以重建回去。但是前序、後序則無法保證可以重建回去。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作