二叉树的所有路径

news2024/12/25 12:52:19

257. 二叉树的所有路径 - 力扣(LeetCode)

题目描述

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

叶子节点 是指没有子节点的节点。

 样例输入

示例 1:

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

示例 2:

输入:root = [1]
输出:["1"]

提示:

  • 树中节点的数目在范围 [1, 100] 内
  • -100 <= Node.val <= 100

代码

前序递归

版本一

/**
 * 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 {
private:
    vector<int> path;//收集中间结果
    vector<string> res;//收集所有结果
public:
    void backing(TreeNode* root)
    {
        path.push_back(root->val);//前序遍历
        //遇到叶子结点就收集结果
        if(!root->left && !root->right)
        {
            //拼接字符串
            string strPath;
            for(int i=0;i<path.size()-1;i++)
            {
                strPath+=to_string(path[i]);
                strPath+="->";
            }
            strPath+=to_string(path[path.size()-1]);
            //收集结果
            res.push_back(strPath);
            return ;
        }

        //递归遍历左子树
        if(root->left){
            backing(root->left);
            path.pop_back();//回溯
        }
        //递归遍历右子树
        if(root->right){
            backing(root->right);
            path.pop_back();//回溯
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        backing(root);
        return res;
    }
};

版本二 

/**
 * 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 {
private:
    vector<string> res;
public:
    //此处path不能使用引用类型,
    //因为值传递的复制效果,使得函数在返回上一层时间接实现了递归的回溯
    void backing(TreeNode* root,string path)
    {
        path+=to_string(root->val);
        if(!root->left && !root->right)
        {
            res.push_back(path);
        }

        if(root->left) backing(root->left,path+"->");
        if(root->right) backing(root->right,path+"->");
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        if(!root) return res;
        string path; 
        backing(root,path);
        return res;
    }
};

版本三

版本二的代码拆开后等价于以下代码

/**
 * 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 {
private:
    vector<string> res;
public:
    //此处path不能使用引用类型,
    //因为值传递的复制效果,使得函数在返回上一层时间接实现了递归的回溯
    void backing(TreeNode* root,string path)
    {
        path+=to_string(root->val);
        if(!root->left && !root->right)
        {
            res.push_back(path);
            return ;
        }

        //其实现效果与版本二中的算法等同
        if(root->left) {
            path+="->";//这是本层
            backing(root->left,path);//这是下一层
            path.pop_back();//回溯本层的‘>’
            path.pop_back();//回溯本层的‘-’
        }

        if(root->right){
            path+="->";
            backing(root->right,path);
            path.pop_back();
            path.pop_back();
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        if(!root) return res;
        string path; 
        backing(root,path);
        return res;
    }
};

 前序非递归

/**
 * 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> binaryTreePaths(TreeNode* root) {
        vector<string> res;
        if(!root) return res;

        stack<TreeNode*> pre;
        stack<string> path;

        pre.push(root);
        path.push(to_string(root->val));
        while(!pre.empty())
        {
            TreeNode* p=pre.top();pre.pop();
            string strPath=path.top();path.pop();
            if(!p->left && !p->right)
            {
                res.push_back(strPath);
            }

            if(p->right)
            {
                pre.push(p->right);
                path.push(strPath+"->"+to_string(p->right->val));
            }

            if(p->left)
            {
                pre.push(p->left);
                path.push(strPath+"->"+to_string(p->left->val));
            }
        }

        return res;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304492.html

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

相关文章

以太坊:前世今生与未来

一、引言 以太坊&#xff0c;这个在区块链领域大放异彩的名字&#xff0c;似乎已经成为了去中心化应用&#xff08;DApps&#xff09;的代名词。从初期的萌芽到如今的繁荣发展&#xff0c;以太坊经历了一段曲折而精彩的旅程。让我们一起回顾一下以太坊的前世今生&#xff0c;以…

protobuf基础学习

部分内容出自&#xff1a;https://blog.csdn.net/baidu_32237719/article/details/99723353 proto文件来预先定义的消息格式。数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码。proto文件&#xff0c;简单地说&#xff0c;就是一个消息的协议文件&#xff0c…

【WinRAR】为什么右键没有压缩选项?

我们安装了WinRAR之后想要压缩文件&#xff0c;但是右键点击文件之后发现并没有WinRAR压缩选项&#xff0c;这应该如何设置才能出现右键带有压缩选项呢&#xff1f;方法如下&#xff1a; 首先打开WinRAR&#xff0c;在上面功能中点击选项 – 设置 然后我们在设置界面中切换到集…

Guardrails for Amazon Bedrock 基于具体使用案例与负责任 AI 政策实现定制式安全保障(预览版)

作为负责任的人工智能&#xff08;AI&#xff09;战略的一部分&#xff0c;您现在可以使用 Guardrails for Amazon Bedrock&#xff08;预览版&#xff09;&#xff0c;实施专为您的用例和负责任的人工智能政策而定制的保障措施&#xff0c;以此促进用户与生成式人工智能应用程…

parser

"typescript-eslint/parser": "5.56.0", "vue-eslint-parser": "9.1.0", 代码来自ruoyi-plus vue-eslint-parser是一个专门用于解析Vue.js单文件组件&#xff08;.vue文件&#xff09;的ESLint插件。ESLint是一个用于检查和修复Java…

陪诊软件开发|北京陪诊系统功能介绍

随着互联网技术的不断发展&#xff0c;医疗行业也日新月异。在这个数字化时代&#xff0c;陪诊软件成为了重要的创新工具&#xff0c;为患者和医生提供了全新的医疗服务体验。本文将探讨陪诊软件开发的关键要点及其功能&#xff0c;为您揭示医疗行业的又一面向未来的重要突破口…

【Linux】线程的概念理解,从感知理解到全面深入

1.初始线程概念 在伟大的”计算机哲学“操作系统这本书中&#xff0c;一般给出线程的概念为&#xff1a;是在进程内部运行的一个执行分支&#xff08;执行流&#xff09;&#xff0c;属于进程的一部分&#xff0c;粒度要比进程更加细腻和轻量化。大家对这一概念一看而过既可以…

高频交易双柜台系统如何开通?

市面上的量化系统很多&#xff0c;快速通道也很多&#xff0c;但是可以满足双柜台系统的这个确实是很少的。能满足双柜台系统的&#xff0c;那恐怕只有华锐双柜台系统可以&#xff01;我们先简单来了解下双柜台系统&#xff1a; 华锐双柜台系统&#xff08;SST&#xff09;是…

外贸行业怎么跟进客户?

外贸行业怎么跟进客户&#xff1f; 建立一个完善的跟进系统需要人性化关怀和高效的技术支持。 人性化关怀是指以客户为中心&#xff0c;关注客户的需求和情感&#xff0c;建立真诚、个性化的关系&#xff1b;高效的技术支持则是指利用技术和工具来提高跟进效率和服务质量&#…

QT用户管理效果预览

用户管理效果 QT 用户管理 GITHUB网站 QT版本 CMakeList.txt find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Sql REQUIRED) target_link_libraries(tableView PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)GitHub代码获取链接 GitHub代码获取链接

《码农的噩梦与修电脑的奇幻之旅》

故事从一个充满梦想的码农学习计算机编程开始。他对编写程序充满了热情&#xff0c;认为自己就像是一位能够编织魔法的巫师&#xff0c;能够创造出炫酷的虚拟世界。 然而&#xff0c;这个充满幻想的故事在码农入门的第一天就遭遇了突如其来的挫折。电脑故障了&#xff01;所有…

专栏十五:omicverse在单细胞分析中的实际使用体验和小改动

写一些自己的理解吧,一些小步骤,正在更新中。。。 安装 原作者写的很清楚了 大部分直接抄 个别地方:去选择下载适合自己的pytorch版本PyTorch, 比如我的是cuda12,下载命令实际是 pip3 install torch torchvision torchaudio 查看cuda版本命令 nvidia-smi 当然还有个命…

【GIS】1.什么是空间分析?

新坑&#xff01;&#xff01;&#xff01; 本系列文章主要参考CHICAGO大学的空间数据科学中心的相关课程(&#xffe3;∇&#xffe3;)/感谢分享&#xff5e; 什么是空间分析 空间分析不仅仅是指做一个地图这么简单&#xff0c;而是为这些位置空间添加实际的值&#xff0c;并…

thinkphp商城系统之商品模块表设计

5.后台商品模块 商品模块是商城项目最核心的模块&#xff0c;也是最复杂的。如果说你能掌握这个模块&#xff0c;那对你来说绝对是获益匪浅&#xff0c;这模块会涉及到以下知识点&#xff1a; 聊聊电商领域中的SPU和SKU表的设计&#xff0c;告诉你为什么要这么设计复杂的查询…

实现 wsl ssh 自启动

目录 一、wsl 端操作1.1 创建并编辑 /etc/init.wsl&#xff0c;加入如下内容&#xff0c;并保存1.2 对文件 /etc/init.wsl 添加执行权限1.3 编辑sudoers&#xff0c;避免输入密码 二、windows 端操作2.1 新建 startservice.vbs 文件&#xff0c;并保存如下内容2.2 实现脚本 sta…

前端使用XLSX导出excel表格

1 单个sheet page.js(页面中的导出方法) import { exportExcel } from ../../../utils/exportExcel.js; leadOut() {const arr [{ id: 1, name: 张三, age: 14, sex: 男 },{ id: 2, name: 李四, age: 15, sex: 女 },{ id: 3, name: 王五, age: 16, sex: 男 },];const allR…

MySQL数据恢复之binlog2sql的安装和使用,很详细

MySQL数据恢复之binlog2sql的安装和使用&#xff0c;很详细 一、前言二、binlog2sql的介绍三、安装binlog2sql1、安装git&#xff08;已安装可以跳过&#xff09;&#xff08;1&#xff09;、正常安装&#xff08;2&#xff09;、编译安装报错①、安装libcurl &#xff08;2&am…

Win11专业版,eNSP启动失败,错误代码40 解决方法

微软Win11系统默认开启的 Virtualization-based Security &#xff08;VBS&#xff09;“基于虚拟化的安全性”会导致游戏、跑分性能下降。VBS 基于虚拟化的安全性&#xff0c;通常称为内核隔离。使用硬件虚拟化在内存中创建安全区域&#xff0c;为其他安全功能提供了一个安全平…

DNSLog漏洞探测(五)之XXE漏洞实战

DNSLog漏洞探测(五)之XXE漏洞实战 本文我们来学习如何利用DNSLog平台探测目标网站是否存在RCE漏洞&#xff0c;接下来我们还是利用Pikachu的靶场作为演示。首先我们先进入Pikachu靶场的XXE漏洞界面。 如果此时网站的界面存在着无回显的XXE漏洞&#xff0c;这种情况下&#xff…

JMeter直连数据库

JMeter直连数据库 使用场景操作步骤 使用场景 用作请求的参数化 登录时需要的用户名&#xff0c;密码可以从数据库中查询获取 用作结果的断言 添加购物车下订单&#xff0c;检查接口返回的订单号&#xff0c;是否与数据库中生成的订单号一致 清理垃圾数据 添加商品后&#xff…