分析:
直接使用遍历的方法去做,对于叶子节点单独处理。既然单独处理了,就得想好递归base case返回的时候是否需要对叶子节点进行回溯。而外面的递归遍历左右子树的情况,只需要在它们的前后位置对该节点进行回溯即可。
题解:
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
// 遍历一遍二叉树就能出结果了
traverse(root);
return res;
}
// 记录 traverse 函数递归时的路径
vector<string> path;
// 记录所有从根节点到叶子节点的路径
vector<string> res;
void traverse(TreeNode* root) {
if (!root) {
return;
}
// root 是叶子节点
if (!root->left && !root->right) {
path.push_back(to_string(root->val));
// 将这条路径装入 res
res.push_back(join("->", path));
path.pop_back();
return;
}
// 前序遍历位置
path.push_back(to_string(root->val));
// 递归遍历左右子树
traverse(root->left);
traverse(root->right);
// 后序遍历位置
path.pop_back();
}
string join(const string& sep, const vector<string>& strs) {
string res = "";
for (int i = 0; i < strs.size(); i++) {
res += strs[i];
if (i < strs.size() - 1) {
res += sep;
}
}
return res;
}
};