【LeetCode 34】257.二叉树的所有路径

简介: 【LeetCode 34】257.二叉树的所有路径

一、题意

二、思考过程

这道题涉及到两个概念:

  • 路径
  • 回溯

需要用到的是 前序遍历,通过前序遍历,父节点到叶子节点之后形成路径,将每一条路径转换为串并存到结果集中result中,回溯以后再次重复形成其他路径,进入其他路径,path短暂存放这些路径元素,前序遍历以及回溯过程如下:

我们先使用递归的方式做前序遍历,然后进行回溯

2.1递归三部曲:

  • 递归函数的参数和返回值
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) 
   //path:路径
    //result:存放结果集
  • 确定终止条件
if (cur->left == NULL && cur->right == NULL)
{
    //找到叶子节点,把路径放到result结果集里
}
  • 单层递归逻辑

因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录的路径上的节点,先放进path中。

path.push_back(cur->val);//中间节点

递归和回溯的过程:

if (cur->left)
 {
    traversal(cur->left, path, result);
    path.pop_back(); // 回溯
 }
 if (cur->right)
 {
    traversal(cur->right, path, result);
    path.pop_back(); // 回溯
  }

完整代码:

class Solution {
private:
    void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
        path.push_back(cur->val);//中间节点
        // 这才到了叶子节点
        if (cur->left == NULL && cur->right == NULL) {//将path里的记录路径转换为sting
            string sPath;
            for (int i = 0; i < path.size() - 1; i++) {
                sPath += to_string(path[i]);
                sPath += "->";
            }
            sPath += to_string(path[path.size() - 1]);//记录最后一个节点,叶子结点
            result.push_back(sPath);//收集一个路径
            return;
        }
        if (cur->left) {
            traversal(cur->left, path, result);
            path.pop_back(); // 回溯
        }
        if (cur->right) {
            traversal(cur->right, path, result);
            path.pop_back(); // 回溯
        }
    }
public:
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        vector<int> path;
        if (root == NULL) return result;
        traversal(root, path, result);
        return result;
    }
};


目录
相关文章
|
2月前
【LeetCode 35】112.路径总和
【LeetCode 35】112.路径总和
28 0
|
2月前
【LeetCode 36】113.路径总和II
【LeetCode 36】113.路径总和II
29 0
|
2月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
23 2
|
2月前
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
18 2
|
2月前
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历
18 2
|
2月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
21 0
|
2月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
15 0
|
2月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
20 0
|
2月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
19 0
|
4月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题