257. 二叉树的所有路径
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
提示:
树中节点的数目在范围 [1, 100] 内
-100 <= Node.val <= 100
思路
还是典型的题,因为要求从根节点到叶子节点的路线,所以采用前序遍历的方式
but,我一直不太懂回溯和递归…,写不出来,只能抄代码,抄完之后慢慢理解了一些了
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
path.push_back(cur->val);//中
if (cur->left == NULL && cur->right == NULL) {//说明到了叶子节点,逐个把路径中的元素添加到同一个字符串里面,然后添加到结果数组里面
string spath;
for (int i = 0; i < path.size() - 1; i++) {
spath += to_string(path[i]);//to_string 返回字符串
spath += "->";
}
spath += to_string(path[path.size() - 1]);
result.push_back(spath);
return;
}
if (cur->left) {//向左递归
traversal(cur->left, path, result);
path.pop_back();//回溯
}
if (cur->right) {//向右递归
traversal(cur->right, path, result);
path.pop_back();//回溯
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;//存放结果
vector<int> path;//存放每一条路径上面的树
if (root == NULL) return result;
traversal(root, path, result);
return result;
}
};