当前位置: 首页 > article >正文

C++算法练习-day31——二叉树的前/中/后序遍历

题目来源:. - 力扣(LeetCode)

题目思路分析

题目要求实现二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历,并以整数数组的形式返回遍历结果。每种遍历方式都有其特定的节点访问顺序:

  • 前序遍历:根节点 -> 左子树 -> 右子树。
  • 中序遍历:左子树 -> 根节点 -> 右子树。
  • 后序遍历:左子树 -> 右子树 -> 根节点。

这些遍历方式对于理解二叉树的结构、构建二叉树的镜像、以及解决一些特定问题(如二叉搜索树的查找和排序)非常有用。

代码:

#include <vector>  
  
// 二叉树节点的定义(重复部分,实际使用时只需定义一次)  
struct TreeNode {  
    int val;  
    TreeNode *left;  
    TreeNode *right;  
    TreeNode() : val(0), left(nullptr), right(nullptr) {}  
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}  
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}  
};  
  
// 前序遍历的实现  
class PreorderSolution {  
public:   
    std::vector<int> PreorderTraversal(TreeNode* root, std::vector<int>& res) {  
        // 如果当前节点为空,直接返回当前结果数组  
        if (!root) {  
            return res;  
        }  
        // 访问当前节点,将值加入结果数组  
        res.push_back(root->val);  
        // 递归遍历左子树  
        PreorderTraversal(root->left, res);  
        // 递归遍历右子树  
        PreorderTraversal(root->right, res);  
        // 返回遍历结果  
        return res;  
    }  
    std::vector<int> preorderTraversal(TreeNode* root) {   
        std::vector<int> res;  
        return PreorderTraversal(root, res);  
    }  
};  
  
// 中序遍历的实现(类似地,这里也可以与前序遍历合并到一个类中,但为了清晰展示每种遍历方式,分开写)  
class InorderSolution {  
public:  
    std::vector<int> InorderTraversal(TreeNode* root, std::vector<int>& res) {  
        if (!root) {  
            return res;  
        }  
        // 递归遍历左子树  
        InorderTraversal(root->left, res);  
        // 访问当前节点,将值加入结果数组  
        res.push_back(root->val);  
        // 递归遍历右子树  
        InorderTraversal(root->right, res);  
        return res;  
    }  
    std::vector<int> inorderTraversal(TreeNode* root) {   
        std::vector<int> res;  
        return InorderTraversal(root, res);  
    }  
};  
  
// 后序遍历的实现  
class PostorderSolution {  
public:  
    std::vector<int> PostorderTraversal(TreeNode* root, std::vector<int>& res) {  
        if (!root) {  
            return res;  
        }  
        // 递归遍历左子树  
        PostorderTraversal(root->left, res);  
        // 递归遍历右子树  
        PostorderTraversal(root->right, res);  
        // 访问当前节点,将值加入结果数组  
        res.push_back(root->val);  
        return res;  
    }  
    std::vector<int> postorderTraversal(TreeNode* root) {   
        std::vector<int> res;  
        return PostorderTraversal(root, res);  
    }  
};

知识点摘要

  1. 二叉树:一种树形数据结构,每个节点最多有两个子节点,称为左子节点和右子节点。
  2. 遍历:按照某种规则访问树中所有节点的过程。
  3. 前序遍历:根节点 -> 左子树 -> 右子树。
  4. 中序遍历:左子树 -> 根节点 -> 右子树。
  5. 后序遍历:左子树 -> 右子树 -> 根节点。
  6. 递归:在函数内部调用自身的编程技巧,常用于解决可以分解为相似子问题的问题。

本文展示了如何使用递归实现二叉树的前序遍历、中序遍历和后序遍历。每种遍历方式都有其特定的节点访问顺序,这些顺序对于理解二叉树的结构和解决实际问题非常重要。通过递归,我们可以优雅地处理树形数据结构,将复杂问题分解为更小的子问题。希望这篇文章能帮助你更好地理解二叉树的遍历方式以及相关的编程技巧。在实际应用中,你可以根据需要选择合适的遍历方式来处理二叉树。


http://www.kler.cn/a/378633.html

相关文章:

  • 【Linux】命令行参数 | 环境变量
  • 如何对LabVIEW软件进行性能评估?
  • 使用 MONAI Deploy 在 AMD GPU 上进行全身分割
  • Elasticsearch 实战应用详解!
  • 【Java知识】Java基础-对象排序的实现
  • Python代码解析:生成Jieba自定义词典
  • CentOS系统查看CPU、内存、操作系统等信息
  • 第三百零一节 Lucene教程 - Lucene索引文件
  • 开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序中积分使用价值的拓展策略
  • 汽车车牌校验
  • [linux]docker快速入门
  • 华为OD机试 - 连续天数的最高利润额 - 动态规划(Python/JS/C/C++ 2024 C卷 100分)
  • MySQL数据库的使用
  • C#结合JS解决Word添加无效位图导致进程停滞的问题
  • Mybatis Plus 自定义 SQL
  • 18 实战:基于Tkinter和OpenCV的视频编码器:实现MPEG4矩形帧编码器
  • leetcode 693.交替位二进制数
  • 【RabbitMQ】02-Spring AMQP
  • 文件夹无法访问?全面解析与高效恢复策略
  • 【自然资源】关于多测合一,你了解吗?
  • RSA算法:数字安全的基石
  • CentOS9 Stream上安装Edge浏览器
  • 微服务实战系列之玩转Docker(十八)
  • 【TabBar嵌套Navigation案例-常见问题按钮-WebView-加载网页 Objective-C语言】
  • 李红《复变函数与积分变换》第五版课后习题答案PDF
  • (实战)WebApi第9讲:EFCore性能优化(IQueryable延迟查询、取消跟踪机制)