题目表述
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/ \
2 3
\
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
题目来源于 leetcode 每日一题。257. 二叉树的所有路径
解题思路
该题有着很明显的DFS和BFS的特征,因此只要使用DFS和BFS的相关方法就可以实现。
关键点
- 如何将数字转换层字符串。
使用C++的流可以很好解决这个问题。
#include<sstream>
stringstream ss;
ss << node->val;
string temp;
ss >> temp;
- 对vector进行值引用。
- 怎么可以降低内存
在进行递归式的DFS的时候,先不判断是否为叶节点,先逐一判断其子树是否为空。这样可以使得内存降一点,但是为什么,没有想通,望code大神指点。
代码公开
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void dfs(TreeNode* node, string current_path, vector<string> &answer) {
stringstream ss;
ss << node->val;
string temp;
ss >> temp;
if (node->left != NULL) {
dfs(node->left, current_path + temp + "->", answer);
}
if (node->right != NULL) {
dfs(node->right, current_path + temp + "->", answer);
}
if (node->left == NULL && node->right == NULL)
{
answer.push_back(current_path + temp);
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> answer;
if (root == NULL) {
return answer;
}
string path = "";
dfs(root, path, answer);
return answer;
}
};