码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • c++二叉树遍历


    目录

    二叉树节点结构:

    1.1 前序遍历(Preorder Traversal):

    递归实现(preorderRecursive函数):首先访问当前节点,然后递归遍历左子树,最后递归遍历右子树。这种遍历方式可以用于深度优先搜索。

    非递归实现(preorderIterative函数):

    2中序遍历(Inorder Traversal):中序遍历的顺序是左子树 -> 根节点 -> 右子树。

    3后序遍历(Postorder Traversal):后序遍历的顺序是左子树 -> 右子树 -> 根节点。

    4层序遍历(Level Order Traversal):层序遍历按照从上到下、从左到右的顺序遍历每一层的节点。

    5深度优先遍历(Depth-First Traversal):深度优先遍历是一种通用的遍历方式,可以根据需要选择前序、中序、后序遍历方式。


    以下是C++中二叉树前序、中序、后序遍历的递归和非递归实现,以及层序遍历和深度优先遍历的代码和讲解。

    二叉树节点结构:

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

    1.1 前序遍历(Preorder Traversal):

    前序遍历的顺序是根节点 -> 左子树 -> 右子树。

    • 递归实现(preorderRecursive函数):首先访问当前节点,然后递归遍历左子树,最后递归遍历右子树。这种遍历方式可以用于深度优先搜索。
      1. void preorderRecursive(TreeNode* root) {
      2. if (root == NULL) return;
      3. cout << root->val << " ";
      4. preorderRecursive(root->left);
      5. preorderRecursive(root->right);
      6. }

    • 非递归实现(preorderIterative函数):
    • 使用一个栈来模拟递归,首先将根节点入栈,然后循环直到栈为空。在循环内,将栈顶节点出栈并访问,然后将右子节点和左子节点(如果存在)依次入栈,以确保下一次出栈的是左子节点。这样可以按照根-左-右的顺序遍历树。
    1. void preorderIterative(TreeNode* root) {
    2. if (root == NULL) return;
    3. stack s;
    4. s.push(root);
    5. while (!s.empty()) {
    6. TreeNode* node = s.top();
    7. s.pop();
    8. cout << node->val << " ";
    9. if (node->right) s.push(node->right);
    10. if (node->left) s.push(node->left);
    11. }
    12. }
    1. 2中序遍历(Inorder Traversal):中序遍历的顺序是左子树 -> 根节点 -> 右子树。

      • 递归实现(inorderRecursive函数):首先递归遍历左子树,然后访问当前节点,最后递归遍历右子树。中序遍历可以按照从小到大的顺序遍历二叉搜索树的所有节点。
        1. void inorderRecursive(TreeNode* root) {
        2. if (root == NULL) return;
        3. inorderRecursive(root->left);
        4. cout << root->val << " ";
        5. inorderRecursive(root->right);
        6. }

      • 非递归实现(inorderIterative函数):使用一个栈来模拟递归,从根节点出发,每次将当前节点以及所有左子节点入栈,然后出栈并访问节点,再处理右子节点。这样可以按照左-根-右的顺序遍历树。
        1. void inorderIterative(TreeNode* root) {
        2. stack s;
        3. TreeNode* curr = root;
        4. while (curr || !s.empty()) {
        5. while (curr) {
        6. s.push(curr);
        7. curr = curr->left;
        8. }
        9. curr = s.top();
        10. s.pop();
        11. cout << curr->val << " ";
        12. curr = curr->right;
        13. }
        14. }

    2. 3后序遍历(Postorder Traversal):后序遍历的顺序是左子树 -> 右子树 -> 根节点。

      • 递归实现(postorderRecursive函数):首先递归遍历左子树,然后递归遍历右子树,最后访问当前节点。后序遍历通常用于内存管理和资源释放。
        1. void postorderRecursive(TreeNode* root) {
        2. if (root == NULL) return;
        3. postorderRecursive(root->left);
        4. postorderRecursive(root->right);
        5. cout << root->val << " ";
        6. }

      • 非递归实现(postorderIterative函数):需要两个栈,一个用于遍历,另一个用于输出。首先将根节点入遍历栈,然后在循环中,出栈并压入输出栈,然后将左子节点和右子节点分别压入遍历栈。最后,从输出栈中依次出栈并访问节点,得到后序遍历的结果。
        1. void postorderIterative(TreeNode* root) {
        2. if (root == NULL) return;
        3. stack s;
        4. stack output;
        5. s.push(root);
        6. while (!s.empty()) {
        7. TreeNode* node = s.top();
        8. s.pop();
        9. output.push(node);
        10. if (node->left) s.push(node->left);
        11. if (node->right) s.push(node->right);
        12. }
        13. while (!output.empty()) {
        14. TreeNode* node = output.top();
        15. output.pop();
        16. cout << node->val << " ";
        17. }
        18. }

    3. 4层序遍历(Level Order Traversal):层序遍历按照从上到下、从左到右的顺序遍历每一层的节点。

      • 使用队列来实现。从根节点开始,将节点入队列,然后在循环中出队列并访问节点,同时将其子节点入队列。这样可以按照树的层级顺序遍历。
        1. void levelOrder(TreeNode* root) {
        2. if (root == NULL) return;
        3. queue q;
        4. q.push(root);
        5. while (!q.empty()) {
        6. TreeNode* node = q.front();
        7. q.pop();
        8. cout << node->val << " ";
        9. if (node->left) q.push(node->left);
        10. if (node->right) q.push(node->right);
        11. }
        12. }

    4. 5深度优先遍历(Depth-First Traversal):深度优先遍历是一种通用的遍历方式,可以根据需要选择前序、中序、后序遍历方式。

      • 深度优先遍历是一种通用的遍历方法,可以根据需要选择前序、中序、后序遍历方式。在示例中,使用前序遍历的方式进行深度优先遍历。深度优先遍历通过栈来实现,首先将根节点入栈,然后在循环中出栈并访问节点,同时将右子节点和左子节点(按照栈的特性,右子节点先入栈)依次入栈,以确保下一次出栈的是左子节点。
        1. void depthFirst(TreeNode* root) {
        2. if (root == NULL) return;
        3. stack s;
        4. s.push(root);
        5. while (!s.empty()) {
        6. TreeNode* node = s.top();
        7. s.pop();
        8. cout << node->val << " ";
        9. if (node->right) s.push(node->right);
        10. if (node->left) s.push(node->left);
        11. }
        12. }

  • 相关阅读:
    超详细Redis入门教程一
    代码随想录 10.14 || 二叉树 LeetCode 669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.将二叉搜索树转为累加树
    【Visual Leak Detector】核心源码剖析(VLD 1.0)
    .NET CORE 鉴权
    美团一面:为什么线程崩溃崩溃不会导致 JVM 崩溃
    基于STM32程序万年历液晶1602显示-proteus仿真-源程序
    17.复制字符串 ,包括\0
    利用BCEL字节码构造内存马
    谷粒商城实战(044集群学习-redis集群)
    解密Lawnchair:打造个性化极致的Android桌面体验
  • 原文地址:https://blog.csdn.net/clayhell/article/details/132639930
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号