day14
思路:
将所有遍历到的结点,都加入栈中。但当加入要处理的结点时,加完之后要加一个空结点,标记。
当加完之后遍历结点。只要遇见空结点。就说明空结点之后就是要处理的结点
注意:
1.要加入元素之前,记得要先把元素弹出。因为这个元素之后还要按照顺序再添加一次。所以需要弹出。
2.在处理元素之前,也就是遇见了空结点。要先将空结点弹出
3.判断是添加元素还是处理元素。需要查看栈顶元素是否为空,
为空就是处理元素(将栈顶弹出,将值存入res。)
不为空就是加入元素(先将之前的弹出,后依照顺序加入。记得 要加入空的结点
这样就能实现代码一致。
只需要调用几行代码,就可以得到不一样的遍历顺序结果。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> res;
if (root != NULL) st.push(root);
while(!st.empty())
{
TreeNode* node = st.top();
if(node != NULL)
{
st.pop(); // 因为后面需要重复加入 中左右
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
st.push(node);
st.push(NULL);
}
else
{
st.pop(); //将空结点弹出
node = st.top();
st.pop();
res.push_back(node->val);
}
}
return res;
}
};