题目描述
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/ \
2 3
\
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
算法1
DFS遍历
注意由于最后一个元素不加”->”
我是在添加数字的前面才添加”->”
所以要特判第一次加入 if (!path.empty())
C++ 代码
class Solution {
public:
vector<string> ans;
void Dfs(TreeNode* root, string path) {
if (root == NULL) {return;}
if (!path.empty()) { path += "->"; }
path += to_string(root->val);
if (root->right == NULL && root->left == NULL) {
ans.push_back(path);return;
}
Dfs(root->right, path);
Dfs(root->left, path);
}
vector<string> binaryTreePaths(TreeNode* root) {
string path;
Dfs(root, path);
return ans;
}
};
这个题目的回溯是在哪体现的
搜索到了路径1->2->5,处于树的最左端底层, 可不需要回溯到1, 再去搜索 1->3的路径。
这道题不需要回溯吗😂,一直不明白什么时候用到回溯,请教大佬一下
回溯是DFA深度搜索的一部分啊,例子里搜索到1-2-5 到达了5这个底层的点,需要向上继续搜索1-3,这条路线。从5回到根节点1 就是回溯。
一般二叉树的递归搜索都会用到回溯
Leetcode中关于树的简单题目和 剑指OFFER的树的简单题目
以及acwing 92-94 (进阶指南免费活动)有视频题解的题目
看完练习完,DFS就会有自己的体会和解题感觉了
因为这个path是copy的,不是传地址引用的,所以path其实一直都没有变,递归到下一次的时候自动就恢复了