引言
二叉树的遍历是数据结构与算法中的核心内容,常见的遍历方式有前序遍历、中序遍历和后序遍历。本文将基于一个统一的模板代码,实现这三种遍历方式,帮助大家快速掌握二叉树遍历的经典算法。
什么是前序、中序、后序遍历?
- 前序遍历(Preorder Traversal):按照“根节点 -> 左子树 -> 右子树”的顺序访问节点。
- 中序遍历(Inorder Traversal):按照“左子树 -> 根节点 -> 右子树”的顺序访问节点。
- 后序遍历(Postorder Traversal):按照“左子树 -> 右子树 -> 根节点”的顺序访问节点。
模板代码解析
我们使用栈来模拟递归过程,并通过一个统一的模板代码实现前序、中序和后序遍历。以下是模板代码的核心思路:
- 使用栈和标记:通过压入空指针(
NULL)来标记当前节点是否需要被访问。 - 调整节点压入顺序:根据遍历方式的不同,调整节点的压入顺序。
- 统一处理逻辑:当遇到空指针时,说明当前节点需要被访问,将其值加入结果集。
模板代码实现
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if (root != NULL) st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
if (node != NULL) {
if (node->right) st.push(node->right); // 右
if (node->left) st.push(node->left); // 左
st.push(node); // 中
st.push(NULL); // 标记
} else {
node = st.top();
st.pop();
result.push_back(node->val);
}
}
return result;
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if (root != NULL) st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
if (node != NULL) {
if (node->right) st.push(node->right); // 右
st.push(node); // 中
st.push(NULL); // 标记
if (node->left) st.push(node->left); // 左
} else {
node = st.top();
st.pop();
result.push_back(node->val);
}
}
return result;
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
if (root != NULL) st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
if (node != NULL) {
st.push(node); // 中
st.push(NULL); // 标记
if (node->right) st.push(node->right); // 右
if (node->left) st.push(node->left); // 左
} else {
node = st.top();
st.pop();
result.push_back(node->val);
}
}
return result;
}
};
代码解析
-
前序遍历:
• 压入顺序:右子节点 -> 左子节点 -> 当前节点 -> 空指针。
• 访问顺序:当前节点 -> 左子节点 -> 右子节点。 -
中序遍历:
• 压入顺序:右子节点 -> 当前节点 -> 空指针 -> 左子节点。
• 访问顺序:左子节点 -> 当前节点 -> 右子节点。 -
后序遍历:
• 压入顺序:当前节点 -> 空指针 -> 右子节点 -> 左子节点。
• 访问顺序:左子节点 -> 右子节点 -> 当前节点。
示例
假设有如下二叉树:
1
/ \
2 3
/ \
4 5
• 前序遍历:[1, 2, 4, 5, 3]
• 中序遍历:[4, 2, 5, 1, 3]
• 后序遍历:[4, 5, 2, 3, 1]
总结
通过一个统一的模板代码,我们可以轻松实现二叉树的前序、中序和后序遍历。关键在于调整节点的压入顺序,并通过空指针标记当前节点是否需要被访问。希望本文能帮助大家更好地理解和掌握二叉树的遍历算法。
欢迎大家在评论区留言讨论,如果有任何问题或建议,也欢迎提出!
关注我,获取更多数据结构与算法的干货内容!
1万+

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



