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;
}
};
本文介绍了一种通用的二叉树遍历算法实现方法,该方法通过使用栈和结构体来标记节点状态,实现了前序、中序和后序遍历的统一处理。这种方法提高了代码的复用性,并通过调整节点的入栈顺序实现了不同遍历顺序的控制。
2578

被折叠的 条评论
为什么被折叠?



