在C++中,可以使用递归或迭代的方法来实现二叉树的三种常见遍历方式:前序遍历、中序遍历和后序遍历。这里我将演示递归的方式来实现这三种遍历。
假设你有一个二叉树的节点结构定义如下:
- struct TreeNode {
- int value;
- TreeNode* left;
- TreeNode* right;
- TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
- };
- void preorderTraversal(TreeNode* root) {
- if (root) {
- std::cout << root->value << " "; // 访问根节点
- preorderTraversal(root->left); // 遍历左子树
- preorderTraversal(root->right); // 遍历右子树
- }
- }
- void inorderTraversal(TreeNode* root) {
- if (root) {
- inorderTraversal(root->left); // 遍历左子树
- std::cout << root->value << " "; // 访问根节点
- inorderTraversal(root->right); // 遍历右子树
- }
- }
- 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); // 再将左子树入栈
- }
- }
- }