leetcode上的相关题目:
前序:https://leetcode.com/problems/binary-tree-preorder-traversal/?tab=Description
中序:https://leetcode.com/problems/binary-tree-inorder-traversal/?tab=Description
后序:https://leetcode.com/problems/binary-tree-postorder-traversal/?tab=Description
这里有一个前人的解法,值得参考。点击打开链接
不过,上面的解法由于三种遍历方式各不相同,代码复用性不好。下面的解决思路,利用一个封装的结构体,对要访问的二叉树节点的状态进行标记。依然是用栈来进行存储,每个节点分别入栈出栈两次。具体过程还是看代码吧。
struct command{
string s;
TreeNode * node;
command(string s, TreeNode* node) :s(s), node(node){};
};
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if (root == NULL)
return res;
stack<command> st;
st.push(command("go", root));
//每一个节点分别入栈出栈各两次,第一次入栈,标记为“go”;第二次入栈,标记为“print”
//之所以两次入栈,第一次出栈后就是对左右节点进行访问的信号;接下来就要根据访问顺序对三者的进栈顺序进行设定
while (!st.empty()){
command com = st.top();
st.pop();
if (com.s == "print"){
res.push_back(com.node->val);
}
else{
assert(com.s == "go");
//前序,中序,后序的区别就在于当前节点第二次入栈的位置,如果在左右节点之后入栈,那就是先序;
//如果是左右节点之间那就是中序;如果是左右节点之前入栈,那就是后序。
if (com.node->right)
st.push(command("go", com.node->right));
if (com.node->left)
st.push(command("go", com.node->left));
st.push(command("print", com.node));
}
}
return res;
}
};