题目描述:
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入: 1 / \ 2 3 \ 5 输出: ["1->2->5", "1->3"] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
思路:
本题仍然是用递归的思想。本题和其他一些类似的一个差别是,只要出现分支,那么就要再创建一个string对象,这样才可以保证不遗漏。
通过本题,提醒自己注意几个问题:
(1)对于一个int型数据 val,通常可以通过 val+'0',转化为字符串。但是有一个问题,那就是如果 val 是一个负数,那么这么做就错了。
另外,即使 val 是一个大于0的数,如果val是一个两位数,那么通过 val+'0' 这样的方式来实现int转string也是不行的。只有数字0到9 可以这么做。这个可以参看ACSII表。简单编写一个程序即可验证。
(2)string的push_back() 函数,它的输入参数是一个 字符,所以不要使用 push_back(to_string(val)) 这样的语句,很蠢。
因为这个语句的对象是一个string了,不符合要求。
如果想要将连个string对象连接起来,可以通过 + 运算符来实现。
代码:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> res;
if(root==NULL) return res;
string temp;
temp+=to_string(root->val);//注意不要用push_back(),push_back()插入的对象是一个字符,不是一个string,
//也不要使用 root->val+'0' 这个操作可以通过例子,但是提交的时候,因为有的节点是 负数 导致输出错误
fun(res,root,temp);
return res;
}
void fun(vector<string> &res,TreeNode* root, string temp)//本题自己做地时候,不小心把res的引用给掉了,导致输出为空
{
if(root->left==NULL && root->right==NULL)
{
res.push_back(temp);
}
if(root->left)
{
string left_temp(temp);
left_temp+="->";
left_temp+=to_string(root->left->val);
fun(res,root->left,left_temp);
}
if(root->right)
{
string right_temp(temp);
right_temp+="->";
right_temp+=to_string(root->right->val);
fun(res,root->right,right_temp);
}
}