题目:
给一棵二叉树,找出从根节点到叶子节点的所有路径。
样例
给出下面这棵二叉树:
1
/ \
2 3
\
5
所有根到叶子的路径为:
[
"1->2->5",
"1->3"
]
思路:
这个题的重点在于如何存储前面的结点的值,用递归的思想。下面说一下具体实现:
首先说一下存储所有路径的函数allpath的大体思路。如果当前点不为空就将其值放入向量path中存储,这个递归的参数中传递的是局部变量向量path,每个函数中的path和前一个函数的path中的元素不同,这就保证了每个path存储了一条路径。当遇到叶子节点时,停止递归,将当前路径放入以string为元素的向量。中间将数值变为string是一个较为创新的地方。
在主函数中调用写的allpath函数,得到所有路径。
代码:
class Solution {
public:
/**
* @param root the root of the binary tree
* @return all root-to-leaf paths
*/
std::vector<string> ap;
void allpath(TreeNode *root,vector<int> path)
{
if(root!=NULL)
{
path.push_back(root->val);
if(root->left==NULL&&root->right==NULL)
{ string a;
int n=path.size();
if(n==1)
a=to_string(path[0]);
else
{ for(int i=0;i<n-1;i++)
{ string str=to_string(path[i]);
a=a+str+"->";
}
string str1=to_string(path[n-1]);
a=a+str1;
}
ap.push_back(a);
}
else
{
allpath(root->left,path);
allpath(root->right,path);
}
}
}
vector<string> binaryTreePaths(TreeNode* root) {
// Write your code here
vector<int> p;
allpath(root,p);
return ap;
}
};
感想:
这个题是在老师讲了之后做的,不一样的地方就是变为string类型。之前想过这个题不知道如何下手,传局部变量的想法很好的解决了这个问题,突然有种恍然大悟的感觉,传局部变量,存储不同的信息的做法十分值得学习。