題目描述:
給定整數 n,返回所有包含 n 個節點的滿二元樹(Full Binary Tree)。滿二元樹的定義是:每個節點要麼有 0 個子節點(葉子),要麼有 2 個子節點。節點值皆為 0。
解題思路: 遞迴 + 記憶化:
n 為偶數直接返回空。n = 1 時返回一個單節點樹。n 個節點的樹,根節點佔 1 個,剩餘 n - 1 個分配給左右子樹。左子樹用 i 個節點,右子樹用 n - 1 - i 個(i 為奇數)。n。時間複雜度:O(2^(n/2)) — 滿二元樹的數量等於卡特蘭數 C(n/2),生成每棵樹需 O(n),總計為 O(n * C(n/2))。
空間複雜度:O(n * 2^(n/2)) — 存儲所有生成的樹節點,加上遞迴棧深度 O(n)。
1. If n is even, return empty list. 2. If n == 1, return list containing a single node. 3. If memo contains n, return memo[n]. 4. Initialize result list. 5. For i = 1, 3, 5, ..., n-2: a. leftTrees = allPossibleFBT(i) b. rightTrees = allPossibleFBT(n - 1 - i) c. For each (left, right) pair: create root with left and right children, add to result. 6. Store result in memo[n] and return.
迭代式 DP:用陣列 dp[i] 存放 i 個節點的所有滿二元樹,從小到大構建。與遞迴邏輯相同但避免了棧開銷。空間複雜度不變。
Clone-based 遞迴:每次組合時深拷貝子樹節點,確保不同樹之間不共享節點。記憶體消耗更大,但樹結構獨立,方便後續修改。