解題說明
Construct String from Binary Tree
題目描述:給定一棵二元樹的根節點,使用前序遍歷將其轉換成一個由括號和整數組成的字串。空節點用 () 表示,但需要省略不影響一對一映射關係的空括號。具體來說:若節點只有右子樹而沒有左子樹,需要保留左子樹的空括號 ();若節點只有左子樹沒有右子樹,可以省略右子樹的括號。
解題思路:使用遞迴(前序遍歷)處理每個節點。對於當前節點,先將其值轉為字串。接著處理左右子樹:
- 若左右子樹都為空,不加任何括號。
- 若只有左子樹(右子樹為空),遞迴處理左子樹並加括號。
- 若只有右子樹(左子樹為空),左子樹要加空括號
(),然後遞迴處理右子樹並加括號。 - 若兩者都存在,分別遞迴處理並加括號。
C++ 解法
複雜度分析
時間複雜度:O(n) — 每個節點恰好被訪問一次,n 為節點數量。
空間複雜度:O(n) — 遞迴呼叫堆疊在最壞情況下(退化樹)為 O(n),結果字串長度也為 O(n)。
虛擬碼
1. If root is null, return empty string
2. result = string(root.val)
3. If left child exists OR right child exists:
a. result += "(" + tree2str(left) + ")"
4. If right child exists:
a. result += "(" + tree2str(right) + ")"
5. Return result其他解法
迭代法(使用堆疊):用顯式堆疊模擬前序遍歷,搭配一個 visited 集合來追蹤已處理的節點,在回溯時加入右括號。時間複雜度 O(n),空間複雜度 O(n)。迭代法避免了遞迴深度限制,但程式碼較為複雜,面試中遞迴解法更加直觀。
延伸思考
- 如果要從這種字串格式反向還原二元樹,該如何設計解析演算法?
- 若改用中序遍歷或後序遍歷來生成字串,是否也能保證一對一映射?
- 能否用迭代方式實現,避免遞迴深度限制?