给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
思路:找到所有路径,可以用深度优先搜索,而深度优先搜索,在本题就是递归加回溯的过程。我们可以想先从根节点开始,向着一个方向遍历,保存经过的路径,如果碰到了叶节点,把从根节点到叶节点的路径保存,不断的往下遍历的过程可以用递归实现,然后返回到上一节点,这个返回过程就是回溯,再往另一个方向的遍历。
- 确定递归函数返回类型和参数列表:返回类型为void,参数列表需要有当前节点,用string类型保存的路径,以及保存所有路径的vector类型的动态数组。
- 确定终止条件:先把当前节点加入path,如果当前节点是叶子节点,就把path加入result里。
- 确定单层递归逻辑:如果当前节点的左子树存在,找左子树到叶节点的路径;如果当前节点的右子树存在,找右子树到叶节点的路径。这里因为path并没有用引用,所以当遇见叶子节点,返回时path保存的是从根节点到当前节点的路径。
代码:
class Solution { //257. 二叉树的所有路径
private:
void _findPath(TreeNode* cur, string path, vector<string>& result) {
path += to_string(cur->val);
if (cur->left == nullptr && cur->right == nullptr) {
result.push_back(path);
return;
}
if (cur->left) {
_findPath(cur->left, path + "->", result);
}
if (cur->right) {
_findPath(cur->right, path + "->", result);
}
}
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
string path;
if (root == nullptr ) {
return result;
}
_findPath(root, path, result);
return result;
}
};
参考资料:代码随想录