題目描述:根據前序遍歷和中序遍歷陣列,重建唯一的二元樹。
解題思路:前序遍歷的第一個元素是根節點。在中序遍歷中找到根節點的位置,其左側是左子樹的中序序列,右側是右子樹的中序序列。根據左子樹的大小,可以在前序遍歷中找到左右子樹各自的前序序列。遞迴重建兩個子樹。用雜湊表記錄中序值到索引的映射以加速查找。
時間複雜度:O(n) — 每個節點建立一次;雜湊表查找 O(1)。
空間複雜度:O(n) — 雜湊表加遞迴棧。
1. Build index map: inorder value -> index 2. build(preStart, preEnd, inoStart, inoEnd): a. If preStart > preEnd: return null b. root = pre[preStart] c. mid = inorderIndex[root] d. leftSize = mid - inoStart e. root.left = build(preStart+1, preStart+leftSize, inoStart, mid-1) f. root.right = build(preStart+leftSize+1, preEnd, mid+1, inoEnd) 3. Return root
遞迴無雜湊 O(n²) 最壞:逐一掃描 inorder 找根位置,未使用雜湊 — 時間複雜度更差。
迭代堆疊 O(n) 時間,O(h) 空間:用堆疊模擬遞迴,追蹤左右邊界 — 邏輯複雜但避免遞迴。