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

dfs(二十)257. 二叉树的所有路径

257. 二叉树的所有路径

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

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

示例 1:

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

示例 2:

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

提示:

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

 解法一:全局变量path来存放

使用dfs先将每条路径存储在一个vector中,最后再从vector转入string中。

为什么使用vector?因为在dfs操作的时候使用的是全局变量temp来记录每次的路径元素,使用vector可以很容易的进行push pop 操作,其实使用string temp也可以,不过会比较麻烦。

/**
 * 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> res;
    vector<string> binaryTreePaths(TreeNode* root) {
        PreOrder(root);
        // Print();
        for(int i = 0; i < ret.size(); i++)
        {
            string temp;
            for(int j = 0; j < ret[i].size(); j++)
            {
                if(j > 0)
                    temp += "->";
                temp += to_string(ret[i][j]);
            }
            res.push_back(temp);
        }
        return res;
    }
    vector<vector<int>> ret;
    vector<int> temp;
    void PreOrder(TreeNode* root)
    {
        if(root == nullptr)
            return;
        temp.push_back(root->val);
        if(root->left == nullptr && root->right == nullptr)
        {
            ret.push_back(temp);
        }
        PreOrder(root->left);
        PreOrder(root->right);
        temp.pop_back();
    }
    void Print()
    {
        for(int i = 0; i < ret.size(); i++)
        {
            for(int j = 0; j < ret[i].size(); j++)
                cout<<ret[i][j]<<" ";
            cout<<endl;
        }
    }
};

解法二:path放入函数头上进行传参

在进行dfs操作时候分为俩种情况  叶子节点 和  非叶子节点

访问到叶子结点时,说明path中存放了一条合理的路径,我们直接将其放入res结果即可,在函数返回的时候path中之前新插入的元素随着栈帧的返回自行进行pop,省略了我们需要进行pop这一步骤

class Solution {
public:
    vector<string> res;
    vector<string> binaryTreePaths(TreeNode* root) {
        string path;
        dfs(root, path);
        return res;
    }

    void dfs(TreeNode* root, string path)
    {
        if(root == nullptr)
            return;
        
        if(root->left == nullptr && root->right == nullptr)
        {
            path += to_string(root->val);
            res.push_back(path);
            return;
        }
        else
        {
            path += to_string(root->val); //相同的操作可以提前放判断之前
            path += "->";    // 前面没有return可以直接放在判断之后
        }
        dfs(root->left, path);
        dfs(root->right, path);
    }
};

优化后:

class Solution {
public:
    vector<string> res;
    vector<string> binaryTreePaths(TreeNode* root) {
        string path;
        dfs(root, path);
        return res;
    }

    void dfs(TreeNode* root, string path)
    {
        if(root == nullptr)
            return;
        path += to_string(root->val);
        if(root->left == nullptr && root->right == nullptr)
        {
            res.push_back(path);
            return;
        }
        path += "->";
        dfs(root->left, path);
        dfs(root->right, path);
    }
};

相关文章:

  • /proc/[pid]/maps介绍和pmap介绍、RSS
  • 《深入理解 TypeScript:函数类型与泛型全解析》(万字长文)
  • 【MyDB】5-索引管理之 1-索引管理思路概览
  • Centos7配置本地yum源
  • 大白话读懂java对象创建的过程
  • 织梦DedeCMS数据库表说明大全
  • django入门教程之request和reponse【二】
  • Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(六)
  • 联想拯救者触摸板会每次开机都自动关闭、联想笔记本触摸板关闭、笔记本电脑触摸板自动关闭的解决方法
  • 演员马晓琳正式加入创星演员出道计划,开启演艺事业新篇章
  • 基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统
  • @maptalks/gl-layers中的VectorTileLayer的setStyle属性的全部line配置
  • 群体智能优化算法-模拟退火优化算法(Simulated Annealing, SA,含Matlab源代码)
  • 前端Tailwind CSS面试题及参考答案
  • 实时时钟芯片HYM1381的使用(51单片机)
  • 在K8S中挂载 Secret 到 Pod
  • 【C#知识点详解】ExcelDataReader介绍
  • day3 微机运算基础
  • 【LINUX操作系统】 动静态库的链接原理
  • 指令系统2(Load/Store 指令)
  • 2人恶意传播刘国梁谣言被处罚,媒体:以法律利剑劈谣斩邪,加快推进依法治体
  • 新任重庆市垫江县委副书记刘振已任县政府党组书记
  • 北京韩美林艺术馆党支部书记郭莹病逝,终年40岁
  • 美联储官员:美国经济增速可能放缓,现行关税政策仍将导致物价上涨
  • 马上评|家长抱婴儿值护学岗,如何避免“被自愿”?
  • “走进书适圈”:一周城市生活