• 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. }

  • 相关阅读:
    研究生拟录取分享
    查看打开物料账期 MMRV 和 MMPV
    【机器学习】主成分分析
    linux批量修改多个文件的同一部分内容
    UE DTDataTable 插件说明, 运行中操作CSV文件。
    【多媒体技术与实践】数据无损压缩编码
    缓冲区的管理
    加密经济时代:Web3如何改变我们的生活方式
    新型基础测绘与实景三维中国建设技术文件【3】基础地理实体空间身份编码规则
    Linux编译安装libmodbus库
  • 原文地址:https://blog.csdn.net/m0_38086244/article/details/133905775