代码随想录 二叉树:所有路径
题目描述
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
题目链接:https://leetcode.cn/problems/binary-tree-paths/
文章讲解:https://programmercarl.com/0257.二叉树的所有路径.html
思考
根节点到叶子节点的路径,先处理根节点,在处理叶子节点,所以前序遍历。
我们会有一个path跟着节点走,每到一个新的节点就把节点值加入到path里面,如果返回就把path的最后一个值删除(这是回溯),如果到了叶子节点,就构造一个字符串,按照要求把path所包含的所有节点串联起来添加到结果列表中。
递归三部曲
1、递归函数
不用返回值,传入根节点和path和result的引用
2、终止条件
叶子节点时终止,并构造字符串并加入到结果中
3、单层递归逻辑
先处理中间节点,即当前遍历到的节点,加入到path中。随后是递归和回溯。当前节点有左子节点,就递归且回溯。右子节点同理
代码实现
C++
class Solution {
public:
void traversal(TreeNode* node, vector<string>& result,vector<int>& path){
path.push_back(node->val);
if(node->left == nullptr && node->right == nullptr){
string spath;
for(auto pa:path){
spath+= to_string(pa);
spath+="->";
}
spath.pop_back();
spath.pop_back();
result.push_back(spath);
return;
}
if(node->left != nullptr){
traversal(node->left,result,path);
path.pop_back();
}
if(node->right != nullptr){
traversal(node->right,result,path);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
traversal(root,result,path);
return result;
}
};
注意path里面是int,而构造的spath是字符串,int到string要转换一下。