使用栈 + 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;
}
// 根 -> 左 -> 右
if (node->right) st.push({
node->right, false});
if (node