leetcode 257 二叉树的所有路径

简介: leetcode 257 二叉树的所有路径

二叉树的所有路径


70fa4fe8c6b44a559d74b4a4c475dfde.png

递归法(非回溯,浪费内存)

直接递归字符串,每一次递归都产生一个新字符串。没有回溯的过程,浪费空间。

/**
 * 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> result;
    void get_road(TreeNode* cur  , string &s)
    {
        if(cur == nullptr) return;
        s += to_string(cur->val);
        if(cur->left == nullptr && cur->right == nullptr )
        {
            result.push_back(s);
            return;
        }else if(cur->left != nullptr && cur->right == nullptr )
        {   
            s += "->";
            string s1 =s;
            get_road(cur->left ,s1);
        }else if (cur->left == nullptr && cur->right != nullptr )
        {
            s += "->";
            string s1 =s;
            get_road(cur->right ,s1);
        }else
        {
            s += "->";
            string s1 =s;
            string s2 =s;
            get_road(cur->left ,s1);
            get_road(cur->right ,s2);
        }
        return;
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        string s;
        get_road(root ,s);
        return result;
    }
};

递归回溯法

使用一个数组来保存路径数据,然后在转换成字符串。

效率略低,充分体现回溯的思想。

/**
 * 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:
    void get_road(TreeNode* cur  , vector<string> &result , vector<int> &path)
    {
        if(cur == nullptr) return;
        path.push_back(cur->val);
        if(cur->left == nullptr && cur->right == nullptr )
        {
            string tmp;
            for(int i=0 ; i < path.size()-1 ;i++ )
            {
                tmp += to_string(path[i]);
                tmp += "->";
            }
            tmp += to_string(path[path.size()-1]);
            result.push_back(tmp);
            return;
        }
        if(cur->left != nullptr  )
        {   
           get_road(cur->left,result,path);
           path.pop_back();
        } 
        if(cur->right != nullptr)
        {
           get_road(cur->right,result,path);
           path.pop_back();
        }
        return;
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        vector<int> path;
        if(root == nullptr) return result;
        get_road(root ,result , path);
        return result;
    }
};

递归回溯(精简版)

不使用数组进行纪录,直接进行字符串回溯

/**
 * 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:
    void get_road(TreeNode* cur  , vector<string> &result , string path)
    {
        if(cur == nullptr) return;
        path +=  to_string(cur->val);
        if(cur->left == nullptr && cur->right == nullptr )
        {
            result.push_back(path);
            return;
        }
        if(cur->left != nullptr  )
        {   
           get_road(cur->left,result, path + "->");
        } 
        if(cur->right != nullptr)
        {
           get_road(cur->right,result, path + "->");
           path.pop_back();
        }
        return;
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        string path;
        if(root == nullptr) return result;
        get_road(root ,result , path);
        return result;
    }
};

二刷

/**
 * 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> result;
    void back_trak(TreeNode* cur , string tmp)
    {
        if(cur == nullptr) return;
        if(cur->left == nullptr && cur->right == nullptr) 
        {
            tmp += to_string(cur->val);
            result.push_back(tmp);
            return;
        };
        tmp += to_string(cur->val);
        tmp += "->";
        back_trak(cur->left,tmp);
        back_trak(cur->right,tmp);
        return;
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        if(root == nullptr) return result;
        string tmp;
        back_trak(root,tmp);
        return result;
    }
};


相关文章
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
44 6
|
2月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
2月前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历
|
2月前
|
存储 算法 Linux
LeetCode第71题简化路径
文章讲述了LeetCode第71题"简化路径"的解题方法,利用栈的数据结构特性来处理路径中的"."和"..",实现路径的简化。
LeetCode第71题简化路径
|
2月前
|
算法
LeetCode第64题最小路径和
LeetCode第64题"最小路径和"的解题方法,运用动态规划思想,通过构建一个dp数组来记录到达每个点的最小路径和,从而高效求解。
LeetCode第64题最小路径和
|
2月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
38 7
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
30 3
|
2月前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
24 4
|
2月前
|
存储 Python
【Leetcode刷题Python】滑雪路径消耗时间:Testing Round #16 (Unrated) C. Skier
Leetcode题目"Testing Round #16 (Unrated) C. Skier"的Python解决方案,题目要求计算给定滑雪路径字符串的总耗时,其中未走过的边耗时5秒,走过的边耗时1秒。
38 4
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
30 2