LeetCode257. 二叉树的所有路径

news2024/9/20 12:39:18

写在前面:

题目链接: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.coloradmin.cn/o/660193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里P8架构师手码的Java工程师面试小抄在Github火了,完整版限时开源

网上的 JAVA 面试文档更是层出不穷。但是单单刷 JAVA 面试题就足够了吗&#xff1f; 答案显然是不够的&#xff01;那么为什么呢&#xff1f; 因为现在的程序员就业环境早就和两年前不可同日而语了。 如果你在两年前面试&#xff1a; 就拿 JVM 来说&#xff0c;刷面试题可能…

Springboot+vue.js+协同过滤推荐+余弦相似度算法实现新闻推荐系统

Springbootvue.js协同过滤推荐余弦相似度算法实现新闻推荐系统 - 简书 针对海量的新闻资讯数据&#xff0c;如何快速的根据用户的检索需要&#xff0c;完成符合用户阅读需求的新闻资讯推荐&#xff1f;本篇文章主要采用余弦相似度及基于用户协同过滤算法实现新闻推荐&#xff0…

SpringMvc详解

SpringMvc用来代替展示层Servlet&#xff0c;均属于Web层开发技术 Servlet是如何工作的 1、导入Servlet依赖坐标 2、创建一个Servlet接口实现类&#xff0c;重写其中的所有方法 3、在Servlet实现类上加上WebServlet注解&#xff0c;用来配置Servlet访问路径 4、启动Tomca…

Misc(6)

隐藏的钥匙 还是一样挨个试&#xff0c;详细信息里没有发现flag信息&#xff0c;就用010打开试试 文件头正常&#xff0c;暂时没有发现隐藏文件 喝&#xff0c;多搜搜还是有收获的&#xff0c;一开始以为是有隐藏文件就利用ctrlf在010中进行搜索 分别搜索了txt和rar文件都没有反…

VLAN基础知识2_VLAN二层通信原理

目录 1.VLAN二层通信简介 2.同一交换机VLAN二层通信 3.跨交换机VLAN二层通信 4.VLAN二层通信实验 4.1 VLAN基本配置命令 4.2 VLAN配置步骤 4.3 VLAN二层通信实验效果 1.VLAN二层通信简介 VLAN是一个逻辑上的分组&#xff0c;可以将一个物理网络端口分割成多个虚拟网络&…

C++初始化列表详解

写在前面&#xff1a; 初始化列表是一种用于初始化成员变量的语法结构&#xff0c;它可以在类的构造函数中使用&#xff0c;用于初始化类的成员变量。 而 列表初始化指的是 是一种初始化变量的简洁方式&#xff0c;可以用花括号{}来表示。列表初始化可以用于各种类型的变量&…

某农业大学c/c++第五次实验(类和对象)

1.Time时间类 【问题描述】 设计一个Time类&#xff0c;并设计多个重载的构造函数&#xff0c;可以设置时间、进行时间的加减运算、按12小时格式和24小时格式输出时间。 例如&#xff1a; 其中构造函数Time::Time(int s)根据总秒数计算hour、minute、second并构造对象&#x…

C语言,BMP格式解析,生成不同位深的图片。

0.前言 目录 0.前言 1.BMP格式详解 1.1图片的构成 1.2BMP格式 1.2.1文件头 1.2.2位图信息头 1.2.3调色板 1.2.4位图数据 2.生成 3.总结 最近工作任务繁重且对我来说小有难度&#xff0c;但是没有困难的事情做起来怎么有收获呢&#xff1f; 今天推荐一本书《寻找光…

Windows10环境下载安装Oracle19c教程

Windows10环境下载安装Oracle19c教程 前言1. 官网下载2. 运行setup.exe2.1 解压缩2.2 报错解决 3.正式安装3.1 配置选项3.2 系统类3.3 oracle主目录用户3.4 安装位置3.5 先决条件检查3.6 安装产品3.7 安装完成3.8 完全卸载oracle(非必备) 4. 安装验证4.1 CMD验证4.2 SQL Plus4.…

本周大新闻|Quest游戏订阅服务曝光;平价版苹果XR头显25年推出

本周XR大新闻&#xff0c;AR方面&#xff0c;彭博苹果预计25年推出更亲民头显&#xff1b;Vision Pro外屏含微透镜&#xff1b;WWDC23苹果高管脱口秀爆料更多细节&#xff1b;外媒爆料称Vision Pro预期销量改为15万台&#xff1b;VitreaLab展示RGB激光背光技术。还是提前说一下…

leetcode刷题之字符串相关问题

344.反转字符串 方法一&#xff1a;找中间结点&#xff0c;头尾翻转 var reverseString function(s) {let len s.lengthlet mid Math.floor((s.length - 1) / 2) //向下取整 如果长度是奇数&#xff0c;那么mid是最中间的结点 如果长度是偶数&#xff0c;那么mid是中间两个…

【Java技术专题】「攻破技术盲区」带你攻破你很可能存在的Java技术盲点之动态性技术原理指南(反射技术专题)

带你攻破你很可能存在的Java技术盲点之动态性技术原理指南 带你攻破你很可能存在的Java技术盲点之动态性技术原理指南编程语言的类型静态类型语言动态类型语言 技术核心方向反射API反射案例介绍反射功能操作获取构造器长度可变的参数 - 构造方法使用反射 API 获取参数长度可变的…

【软件测试】

系列文章目录 文章目录 系列文章目录前言第四章 单元测试4.1 软件测试过程概述4.2 什么是单元测试4.2.1 单元测试的定义4.2.2 单元测试的重要性4.2.3 单元测试原则 4.3 单元测试的目标和任务4.3.1 单元测试的目标&#xff1a;单元模块被正确编码4.3.2 单元测试的主要任务 4.4 单…

FreeRTOS:事件标志组

目录 一、事件标志组简介1.1事件位(事件标志)1.2事件组1.3事件标志组和事件位的数据类型 二、创建事件标志组2.1函数 xEventGroupCreate()2.2函数xEventGroupCreateStatic() 三、设置事件位3.1函数 xEventGroupClearBits()3.2函数xEventGroupClearBitsFromISR()3.3函数 xEventG…

Python模块MarkupPy 自定义html报告

简介 MarkupPy是Python模块用于生成HTML和XML格式的字符串。它的主要作用是提供了一种比原生HTML/XML更加易读和易写的编写方式&#xff0c;通过Python代码来生成HTML或XML代码。 使用MarkupPy&#xff0c;可以在Python中使用不同的对象类型和方法&#xff0c;来动态地生成HTML…

做自动化测试老是失败?你真的会做吗?资深测试的总结整理...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化正在不断普…

揭开生成式人工智能的力量:60+医疗保健应用场景

预计生成式AI在医疗保健领域的增长速度将超过任何其他行业。在医疗技术领域&#xff0c;AI可带来更高效流程、个性化客户互动、更大的创新和更高价值。为了帮助领导者理解这些机会&#xff0c;BCG最近研究了医疗技术中生成式AI的60多个应用场景&#xff1a;从产研和软件开发到业…

Android自动化测试,5个必备的测试框架

Appium Appium是一个开源的移动测试工具&#xff0c;支持iOS和Android&#xff0c;它可以用来测试任何类型的移动应用&#xff08;原生、网络和混合&#xff09;。作为一个跨平台的工具&#xff0c;你可以在不同的平台上运行相同的测试。为了实现跨平台的功能&#xff0c;Appi…

关于数据库索引的入门简述

一、简介 数据库索引是现代数据库中高效数据检索的一个重要工具。它在优化查询性能和加快数据检索操作方面发挥着重要作用。这里我们深入了解下数据库索引其内部工作原理、优点和局限性。 二、数据库 1、SQL 数据库 为了理解索引&#xff0c;先说一句数据库&#xff0c;数据库…

Jenkins小技巧汇总

设置变量 设置全局环境变量 全局变量除了系统内置的全局环境变量之外&#xff0c;用户也可以设置全局变量。设置路径&#xff1a;【Dashboard】–>【Manage Jenkins】–>【System Configuration 下的 System】–>【Global properties】从描述中我们可以看到&#xf…