| 維度 | 遞歸 | 迭代 (顯式棧/莫里斯) |
|---|---|---|
| 代碼簡潔度 | 極高,符合樹的遞歸定義 | 較繁瑣,需手動維護棧/線索 |
| 可讀性/可維護性 | 優 | 一般 |
| 棧溢出風險 | 深樹 (>10⁴ 層) 會棧溢出 | 無 (堆內存較大) |
| 性能開銷 | 函數調用開銷,略慢 | 略快,但現代編譯器優化後差異微小 |
| 調試難度 | 調用棧清晰 | 需檢查棧數據結構 |
// 統一模板:前中後序只需調整輸出位置
vector traversal(TreeNode* root) {
vector res;
stack> st; // int: 0=未訪問, 1=左完成, 2=右完成
if (root) st.emplace(root, 0);
while (!st.empty()) {
auto [node, state] = st.top(); st.pop();
if (!node) continue;
if (state == 0) { // Pre-order: 處理節點
// res.push_back(node->val); // 前序位置
st.emplace(node, 1);
if (node->left) st.emplace(node->left, 0);
} else if (state == 1) { // In-order: 左完成
// res.push_back(node->val); // 中序位置
st.emplace(node, 2);
if (node->right) st.emplace(node->right, 0);
} else { // Post-order: 左右完成
res.push_back(node->val); // 後序位置
}
}
return res;
}
「遞歸很耗資源」是相對說法。在 64 位系統、默認 8MB 棧下,遞歸深度達萬級才溢出。除非有明確深度超限證據,否則寫人能看懂的遞歸代碼。 面試時展示「遞歸寫得快、迭代寫得穩、莫里斯知原理」的全棧能力最加分。