递归:
在C++中,可以使用递归或迭代的方法来实现二叉树的三种常见遍历方式:前序遍历、中序遍历和后序遍历。这里我将演示递归的方式来实现这三种遍历。
假设你有一个二叉树的节点结构定义如下:
struct TreeNode {
int value;
TreeNode* left;
TreeNode* right;
TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
};
前序遍历(Preorder Traversal):根节点 -> 左子树 -> 右子树
void preorderTraversal(TreeNode* root) {
if (root) {
std::cout << root->value << " "; // 访问根节点
preorderTraversal(root->left); // 遍历左子树
preorderTraversal(root->right); // 遍历右子树
}
}
中序遍历(Inorder Traversal):左子树 -> 根节点 -> 右子树
void inorderTraversal(TreeNode* root) {
if (root) {
inorderTraversal(root->left); // 遍历左子树
std::cout << root->value << " "; // 访问根节点
inorderTraversal(root->right); // 遍历右子树
}
}
后序遍历(Postorder Traversal):左子树 -> 右子树 -> 根节点
void postorderTraversal(TreeNode* root) {
if (root) {
postorderTraversal(root->left); // 遍历左子树
postorderTraversal(root->right); // 遍历右子树
std::cout << root->value << " "; // 访问根节点
}
}
int main() {
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
std::cout << "Preorder traversal: ";
preorderTraversal(root);
std::cout << std::endl;
std::cout << "Inorder traversal: ";
inorderTraversal(root);
std::cout << std::endl;
std::cout << "Postorder traversal: ";
postorderTraversal(root);
std::cout << std::endl;
return 0;
}
非递归:
三种方式差不多这里只给出前序遍历:
#include <stack>
void nonRecursivePreorderTraversal(TreeNode* root) {
if (!root) return;
std::stack<TreeNode*> nodeStack;
nodeStack.push(root);
while (!nodeStack.empty()) {
TreeNode* node = nodeStack.top();
nodeStack.pop();
std::cout << node->value << " "; // 访问根节点
if (node->right) {
nodeStack.push(node->right); // 先将右子树入栈
}
if (node->left) {
nodeStack.push(node->left); // 再将左子树入栈
}
}
}