LeetCode257. 二叉树的所有路径

news/2024/11/28 23:47:07/

写在前面:

题目链接:LeetCode257. 二叉树的所有路径
题目难度:简单
编程语言:C++

一、题目描述

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。
在这里插入图片描述

输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]

示例 2 :

输入:root = [1]
输出:[“1”]

二、题目分析&解题思路

由于是从回溯法里找了一道题,那么就话不多说直接上回溯
如果之前没有了解过回溯的可以先看看回溯的思路:
在这里插入图片描述
如果还是不太理解的话,可以参考下面这篇博客:
LeetCode.46. 全排列(回溯法入门)

不过每个节点的值需要从 int 转到 string
刚开始不知道 C++ 里面有专门 Int To string 的方法(大傻子本人了)
然后自己啥没写,先自己手写了一个 Int To string 的方法,感觉太傻了,各位献丑了:

vector<string> vctMap = {"0","1","2","3","4","5","6","7","8","9"};string IntToStr(int val){if(val >=0 && val < 10){return vctMap[val];}else if(val>-10 && val <0){val = -val;string strResult = "-" + vctMap[val];return strResult;}else {bool isFushu = false;if(val < 0){isFushu = true;val = -val;}//开始取每一位string strResult = "";while( val > 0){int temp = val%10;strResult.insert(0,vctMap[temp]);val/=10;}if(isFushu){strResult.insert(0, "-");}return strResult;}}

然后下面才是回溯的代码:

    //回溯函数void back(TreeNode* root, string strPath){//终止条件if(root->left == nullptr && root->right == nullptr){vctResult.push_back(strPath);return;}//不断向递归终止条件逼近//左if(root->left != nullptr){string strTemp = "->"+IntToStr(root->left->val);strPath+=strTemp;back(root->left, strPath);//回溯 也就是把上一次的结果删除掉strPath.resize(strPath.size() - strTemp.size());}//右if(root->right != nullptr){string strTemp = "->"+IntToStr(root->right->val);strPath+=strTemp;back(root->right, strPath);//回溯strPath.resize(strPath.size() - strTemp.size());}}

三、完整代码

class Solution {
public:
vector<string> vctResult;
string strPath = "";
vector<string> vctMap = {"0","1","2","3","4","5","6","7","8","9"};
public://自己傻傻写的int to string 函数string IntToStr(int val){if(val >=0 && val < 10){return vctMap[val];}else if(val>-10 && val <0){val = -val;string strResult = "-" + vctMap[val];return strResult;}else {bool isFushu = false;if(val < 0){isFushu = true;val = -val;}//开始取每一位string strResult = "";while( val > 0){int temp = val%10;strResult.insert(0,vctMap[temp]);val/=10;}if(isFushu){strResult.insert(0, "-");}return strResult;}}//回溯函数void back(TreeNode* root, string strPath){//终止条件if(root->left == nullptr && root->right == nullptr){vctResult.push_back(strPath);return;}//不断向递归终止条件逼近if(root->left != nullptr){//保存每个路径上的节点值string strTemp = "->"+IntToStr(root->left->val);strPath+=strTemp;back(root->left, strPath);//回溯strPath.resize(strPath.size() - strTemp.size());}if(root->right != nullptr){//保存每个路径上的节点值string strTemp = "->"+IntToStr(root->right->val);strPath+=strTemp;back(root->right, strPath);//回溯strPath.resize(strPath.size() - strTemp.size());}}vector<string> binaryTreePaths(TreeNode* root) {if(root == nullptr){return vctResult;}else{//先开始把根节点加上strPath = IntToStr(root->val);back(root, strPath);return vctResult;}}
};

运行结果:
在这里插入图片描述
我们再使用c++ 自己的to_string 接口试试:

/*** Definition for a binary tree node.* 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:
vector<string> vctResult;
string strPath = "";
public://回溯函数void back(TreeNode* root, string strPath){//终止条件if(root->left == nullptr && root->right == nullptr){vctResult.push_back(strPath);return;}//不断向递归终止条件逼近//向左if(root->left != nullptr){string strTemp = "->"+to_string(root->left->val);strPath+=strTemp;back(root->left, strPath);//回溯 也就是把上次的结果删除掉strPath.resize(strPath.size() - strTemp.size());}//向右if(root->right != nullptr){string strTemp = "->"+to_string(root->right->val);strPath+=strTemp;back(root->right, strPath);//回溯strPath.resize(strPath.size() - strTemp.size());}}vector<string> binaryTreePaths(TreeNode* root) {if(root == nullptr){return vctResult;}else{//先开始把根节点加上strPath = to_string(root->val);back(root, strPath);return vctResult;}}
};

运行结果:
在这里插入图片描述


http://www.ppmy.cn/news/455387.html

相关文章

解决笔记本或者联想小新,用着用着忽然熄屏或者黑屏的问题

经过仔细摸索 是由于电池跳电导致了&#xff0c;系统误判&#xff0c;从而导致休眠或者睡眠。 需要在电源选项&#xff0c;里面选择更改计划设置&#xff0c;更改高级电源设置&#xff0c;如下&#xff0c;展开电池选项&#xff0c; 按下图设置阀值&#xff0c;或者更小的值…

电脑故障收集(转)

修改文件右键菜单&#xff08;比如添加打开方式&#xff09; 运行注册表编辑器&#xff0c;打开“我的电脑/HKEY_CLASSES_ROOT/*/shellex/ ContextMenuHandler”分支。该分支下有两个主键HexWorkshopContextMenu和Winzip(自己安装的程序)&#xff0c;删去后即可发现原来文件的弹…

电脑各种故障的维修收集

修改文件右键菜单&#xff08;比如添加打开方式&#xff09; 运行注册表编辑器&#xff0c;打开“我的电脑/HKEY_CLASSES_ROOT/*/shellex/ ContextMenuHandler”分支。该分支下有两个主键HexWorkshopContextMenu和Winzip(自己安装的程序)&#xff0c;删去后即可发现原来文件的弹…

记录所遇到的Windows蓝屏问题、网络错误、硬件故障等问题

文章目录 Windows屏幕问题蓝屏原因排查由于ntoskrnl.exe导致的蓝屏扩展屏 局部闪屏 网络故障某些网站无法访问的可能解决方案ERR_TUNNEL_CONNECTION_FAILED error in Chrome [Solved]Windows 网络诊断结果为"已找到问题&#xff1a;Windows 无法与设备或资源(主 DNS 服务器…

从零开始理解Linux中断架构(4)--学习几条ARM汇编指令

因为entry.S是使用汇编指令编写的。我们需要学习几条汇编,以便能够看懂entry.S来消除很多的底层疑惑。这里只需要理解基本的约定和寻址格式和几条常用的指令,达到能够读懂代码的目的就够了。 1)基本约定: 寄存器: 为标号,不加前缀操作数顺序:目标操作数在左,源操作数在…

Ubuntu安装,配置全教程

1,安装 开机logo界面狂按 F2,在exit界面选择第三个U盘,然后开机 Windows10安装ubuntu18.04双系统教程 - 不妨不妨,来日方长 - 博客园 Ubuntu18.04/20.04完整新手安装教程 - 简书 https://segmentfault.com/a/1190000022102570 Windows11安装Ubuntu 20.04.3 LTS双系统…

Archlinux个人安装流程

操作环境&#xff1a; 时间&#xff1a;2023-02-17 电脑型号&#xff1a;联想拯救者R720 cpu&#xff1a;Intel Core i5-7300HQ 4x 3.5GHz gpu&#xff1a;NVIDIA GeForce GTX 1050 Ti 安装系统&#xff1a; 1.下载镜像&#xff1a; 请访问https://archlinux.org/查找镜…

学校计算机课怎取消红蜘蛛,谁知道怎么退出或卸载“红蜘蛛教学系统” 各位高手帮帮忙啊。。。(我们老师一讲就是一节课)...

1.极域电子教室 极域电子教室是一种纯软件网络多媒体教学产品,是业界内性能价格比最高的产品。它既无硬件版教学网投资大、安装维护困难、图像传输有重影和水波纹以及线路传输距离限制之弊病,同时又克服了其他同类软件版教学网广播效率低、语音延迟大、操作复杂、稳定性兼容性…