• C++:面试二叉树的遍历


    递归:

    在C++中,可以使用递归或迭代的方法来实现二叉树的三种常见遍历方式:前序遍历、中序遍历和后序遍历。这里我将演示递归的方式来实现这三种遍历。

    假设你有一个二叉树的节点结构定义如下:

    1. struct TreeNode {
    2. int value;
    3. TreeNode* left;
    4. TreeNode* right;
    5. TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
    6. };

    前序遍历(Preorder Traversal):根节点 -> 左子树 -> 右子树

    1. void preorderTraversal(TreeNode* root) {
    2. if (root) {
    3. std::cout << root->value << " "; // 访问根节点
    4. preorderTraversal(root->left); // 遍历左子树
    5. preorderTraversal(root->right); // 遍历右子树
    6. }
    7. }

    中序遍历(Inorder Traversal):左子树 -> 根节点 -> 右子树

    1. void inorderTraversal(TreeNode* root) {
    2. if (root) {
    3. inorderTraversal(root->left); // 遍历左子树
    4. std::cout << root->value << " "; // 访问根节点
    5. inorderTraversal(root->right); // 遍历右子树
    6. }
    7. }

    后序遍历(Postorder Traversal):左子树 -> 右子树 -> 根节点

    1. void postorderTraversal(TreeNode* root) {
    2. if (root) {
    3. postorderTraversal(root->left); // 遍历左子树
    4. postorderTraversal(root->right); // 遍历右子树
    5. std::cout << root->value << " "; // 访问根节点
    6. }
    7. }
    1. int main() {
    2. TreeNode* root = new TreeNode(1);
    3. root->left = new TreeNode(2);
    4. root->right = new TreeNode(3);
    5. root->left->left = new TreeNode(4);
    6. root->left->right = new TreeNode(5);
    7. std::cout << "Preorder traversal: ";
    8. preorderTraversal(root);
    9. std::cout << std::endl;
    10. std::cout << "Inorder traversal: ";
    11. inorderTraversal(root);
    12. std::cout << std::endl;
    13. std::cout << "Postorder traversal: ";
    14. postorderTraversal(root);
    15. std::cout << std::endl;
    16. return 0;
    17. }

    非递归:

    三种方式差不多这里只给出前序遍历

    1. #include <stack>
    2. void nonRecursivePreorderTraversal(TreeNode* root) {
    3. if (!root) return;
    4. std::stack<TreeNode*> nodeStack;
    5. nodeStack.push(root);
    6. while (!nodeStack.empty()) {
    7. TreeNode* node = nodeStack.top();
    8. nodeStack.pop();
    9. std::cout << node->value << " "; // 访问根节点
    10. if (node->right) {
    11. nodeStack.push(node->right); // 先将右子树入栈
    12. }
    13. if (node->left) {
    14. nodeStack.push(node->left); // 再将左子树入栈
    15. }
    16. }
    17. }

  • 相关阅读:
    Go语言与Rust哪一个更有发展前景?
    数据结构(2-5~2-8)
    搭建nexus私服部署项目
    ROS 文件系统
    【论文阅读|基于 YOLO 的红外小目标检测的逆向范例】
    ctfshow web入门 php特性 web136-web140
    存储优化知识复习二详细版解析
    【SimpleFunction系列二.2】SpringBoot注解整合Redisson分布式锁
    Django DRF版本号的处理
    内地与香港的贸易数据
  • 原文地址:https://blog.csdn.net/m0_38086244/article/details/133905775