題目描述:給定一棵二元樹的根節點,使用前序遍歷將其轉換成一個由括號和整數組成的字串。空節點用 () 表示,但需要省略不影響一對一映射關係的空括號。具體來說:若節點只有右子樹而沒有左子樹,需要保留左子樹的空括號 ();若節點只有左子樹沒有右子樹,可以省略右子樹的括號。
解題思路:使用遞迴(前序遍歷)處理每個節點。對於當前節點,先將其值轉為字串。接著處理左右子樹:
(),然後遞迴處理右子樹並加括號。時間複雜度: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)。迭代法避免了遞迴深度限制,但程式碼較為複雜,面試中遞迴解法更加直觀。