先序遍历
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
if (root != nullptr) {
st.push(root);
}
while (!st.empty()) {
TreeNode* node = st.top();
if (node != nullptr) {
st.pop(); //将此结点弹出,避免重复操作
if (node->right) st.push(node->right); //右
if (node->left) st.push(node->left); //左
st.push(node); //中
st.push(nullptr);
} else { //每当碰到空指针才把空指针前一个入res
st.pop();
node = st.top();
st.pop();
res.push_back(node->val);
}
}
return res;
}
};
注意:每层循环都有先pop(),将结点弹出,避免重复操作。可以想象成三个元素的子树,每次都是先找到这个头结点,然后根据头结点确定这棵子树后再按你需要的顺序入栈。