给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/ \
2 3
\
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
首先要写一下我自己的错误的思路:利用回溯,到了叶子结点后将当前遍历到的一位数组加入到要返回的二维数组中,当然最后因为题目要求输出的是上边的链表形式,所以我们再重新格式化一下(比较麻烦),代码如下:
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string>res;
string path;
//特殊情况
if (!root) {
return res;
}
helper(res, path, root);
reFormat(res);
return res;
}
void helper(vector<string>&res, string &path,TreeNode *root) {
if (!root) {
return;
}
path += root->val + '0';
if (!root->left && !root->right) {
res.push_back(path);
}
helper(res, path, root->left);
helper(res, path, root->right);
path.pop_back();
}
//转化为要求的格式
void reFormat(vector<string>&res) {
for (int i = 0;i < res.size();i++) {
res[i] = Try(res[i]);
}
}
//单个字符串的转换
string Try(string s) {
vector<string>tmp;
string res;
for (int i = 0;i < s.size();i++) {
string t;
t.push_back(s[i]);
t += "->";
tmp.push_back(t);
}
for (int i = 0;i < tmp.size();i++) {
res += tmp[i];
}
return res.substr(0, res.size() - 2);
}
};
简单的样例都跑过了,但无奈submit后显示207/209 cases通过,希望有懂的帮忙看一下是哪里出了漏洞。
下面是参考的别人的解法,重点是不需要回溯,而是不断的开辟分支(因为若给出两个路径,如果一旦其中有一个节点不同,那么它们两个就是不同的),我们从根节点开始,如果遇到了叶子结点就只加上当前节点并将一维数组压入,否则遍历左右子树,并加入 node->val+"->",简洁易懂,代码如下:
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string>res;
//特殊情况
if (!root) {
return res;
}
helper(res, "", root);
return res;
}
void helper(vector<string>&res,string path,TreeNode *node){
if (!node->left && !node->right) {
path += to_string(node->val);
res.push_back(path);
}
if (node->left) {
helper(res, path + to_string(node->val) + "->", node->left);
}
if (node->right) {
helper(res, path + to_string(node->val) + "->", node->right);
}
}
};