题目表述

给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:

  1. 1
  2. / \
  3. 2 3
  4. \
  5. 5

输出: ["1->2->5", "1->3"]

解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3

题目来源于 leetcode 每日一题。257. 二叉树的所有路径

解题思路

该题有着很明显的DFS和BFS的特征,因此只要使用DFS和BFS的相关方法就可以实现。

关键点

  1. 如何将数字转换层字符串。

使用C++的流可以很好解决这个问题。

  1. #include<sstream>
  2. stringstream ss;
  3. ss << node->val;
  4. string temp;
  5. ss >> temp;
  1. 对vector进行值引用。
  2. 怎么可以降低内存

在进行递归式的DFS的时候,先不判断是否为叶节点,先逐一判断其子树是否为空。这样可以使得内存降一点,但是为什么,没有想通,望code大神指点。

代码公开

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. void dfs(TreeNode* node, string current_path, vector<string> &answer) {
  13. stringstream ss;
  14. ss << node->val;
  15. string temp;
  16. ss >> temp;
  17. if (node->left != NULL) {
  18. dfs(node->left, current_path + temp + "->", answer);
  19. }
  20. if (node->right != NULL) {
  21. dfs(node->right, current_path + temp + "->", answer);
  22. }
  23. if (node->left == NULL && node->right == NULL)
  24. {
  25. answer.push_back(current_path + temp);
  26. }
  27. }
  28. vector<string> binaryTreePaths(TreeNode* root) {
  29. vector<string> answer;
  30. if (root == NULL) {
  31. return answer;
  32. }
  33. string path = "";
  34. dfs(root, path, answer);
  35. return answer;
  36. }
  37. };