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

C++算法练习-day34——257.二叉树的所有路径

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

题目思路分析

题目要求从给定的二叉树中找出所有从根节点到叶子节点的路径,并以字符串的形式返回这些路径。每条路径都应该表示为一个由箭头(->)分隔的节点值序列,从根节点到叶子节点。例如,对于以下二叉树:

    1  / \  2   3  \  5

所有根到叶子的路径为:["1->2->5", "1->3"]

解题思路:

  1. 使用深度优先搜索(DFS)遍历二叉树。
  2. 从根节点开始,每次递归时将当前节点的值添加到路径字符串中。
  3. 如果当前节点是叶子节点(即没有左右子节点),则将当前路径字符串添加到结果列表中。
  4. 如果当前节点不是叶子节点,则继续递归遍历其左右子节点,并在路径字符串中添加箭头(->)作为分隔符。
  5. 最终返回所有路径的列表。

代码:

#include <string>  
#include <vector>  
#include <sstream>  // 用于to_string  using namespace std;  // 二叉树节点的定义  
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 Solution {  
public:  // 递归函数,用于找出所有路径  void num_path(TreeNode* root, string path, vector<string>& paths) {  if (root) {  // 如果当前节点不为空  path += to_string(root->val);  // 将当前节点值添加到路径字符串中  if (!root->left && !root->right) {  // 如果当前节点是叶子节点  paths.push_back(path);  // 将路径添加到结果列表中  } else {  // 如果当前节点不是叶子节点  path += "->";  // 添加箭头作为分隔符  num_path(root->left, path, paths);  // 递归遍历左子节点  num_path(root->right, path, paths);  // 递归遍历右子节点  }  }  }  // 主函数,返回所有路径的列表  vector<string> binaryTreePaths(TreeNode* root) {  vector<string> paths;  // 用于存储所有路径的列表  num_path(root, "", paths);  // 从根节点开始,空字符串作为初始路径  return paths;  // 返回所有路径的列表  }  
};

知识点摘要

  1. 二叉树:一种数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。
  2. 深度优先搜索(DFS):一种用于遍历或搜索树或图的算法,尽可能深的搜索树的分支。
  3. 递归:一种在函数内部调用自身的编程技巧,常用于解决可以分解为相似子问题的问题。
  4. 字符串操作:在C++中,使用std::string类进行字符串的拼接、转换等操作。
  5. 向量(vector):C++标准模板库(STL)中的一种动态数组,可以存储可变数量的元素。

通过这道题目,我们学习了如何使用深度优先搜索(DFS)和递归的方法来遍历二叉树,并找出所有从根节点到叶子节点的路径。在解决这个问题的过程中,我们使用了字符串来记录路径,并使用向量来存储所有路径。此外,我们还了解了C++中字符串和向量的基本操作。这个问题不仅考察了我们对二叉树的理解,还锻炼了我们使用递归和字符串操作的能力。希望这篇文章能帮助你更好地理解这个问题及其解决方案。


http://www.mrgr.cn/news/65846.html

相关文章:

  • 近期学习前端的心得
  • Chromium Mojo(IPC)进程通信演示 c++(1)
  • Java学习Day57:碧水金睛兽!(Spring Cloud微服务1.0)
  • 力扣刷题hot100题python实现
  • 复变函数速通(精简版)
  • 基于SSM+微信小程序的订餐管理系统(点餐2)
  • MATLAB实现图像恢复设计报告
  • 掌握 In-Context Learning (ICL):构建高效 Prompt 的技巧与调优策略
  • Java | Leetcode Java题解之第539题最小时间差
  • 使用QtWebEngine的Mac应用如何发布App Store
  • 文件操作和 IO(二):文件内容操作 => 流对象
  • 小北的字节跳动青训营与LangChain实战课:深入解析模型I/O与提示模板(持续更新中~~~)
  • Java 入门
  • DFS求解迷宫最长移动路线
  • 助力风力发电风机设备智能化巡检,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建无人机巡检场景下风机叶片缺陷问题智能化检测预警模型
  • Java基础06(代码运行时的内存图)
  • 基于matlab的图像形状与分类的方法比较
  • Windows基础2(病毒编写)
  • WordPress站点网站名称、logo设置
  • C语言 | Leetcode C语言题解之第538题把二叉搜索树转换为累加树
  • 科研绘图系列:R语言圆堆积图(circle stacked plot)
  • Nginx线程模型
  • 【AIGC】如何通过ChatGPT轻松打造个性化GPTs应用
  • 【数据结构- 合法括号字符串】力扣1190. 反转每对括号间的子串
  • 代码训练营 day55|卡码网98
  • Linux:网络协议socket