🧠 一、Bool 标记法的原理(模拟递归)
📌 原理解释:
使用栈 + bool
标记记录当前节点是否被“访问过”。
我们将“访问”的定义拆分为两次:
- 第一次:只入栈,暂不处理。
- 第二次:说明其左(或右)子树已处理完,可以正式访问(输出)。
stack<pair<TreeNode*, bool>> st;
每次弹出时,如果 visited == false
,就继续压入子节点;
如果 visited == true
,才处理 node->val
。
🧱 二、统一遍历模板结构
vector<int> traversal(TreeNode* root) {vector<int> res;stack<pair<TreeNode*, bool>> st;if (root) st.push({root, false});while (!st.empty()) {auto [node, visited] = st.top(); // C++17 结构化绑定特性 st.pop();if (!node) continue;if (visited) {res.push_back(node->val); // 只有第二次访问才输出} else {// 下面根据遍历方式调整顺序}}return res;
}
🧭 三、实现三种遍历(只改压栈顺序)
1️⃣ 前序遍历(根→左→右)
// 根 -> 左 -> 右
if (node->right) st.push({node->right, false});
if (node