【代码随想录day 15】 力扣 257. 二叉树的所有路径 - 实践
视频讲解:https://www.bilibili.com/video/BV1ZG411G7Dh/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
力扣题目:https://leetcode.cn/problems/binary-tree-paths/description/
这道题实质上就是一道遍历节点题,但需要记下二叉树的所有路径,涉及到这几个问题:
- 遍历节点记录的是int型,返回的路径是string类型的,因此涉及到类型转换的疑问,运用C++的to_string函数来完成转换。
- 加入"->"符号涉及到末了一条路径没有,因此要分好情况。
- 回溯挑战,关于路径遍历需要回溯到父节点的另一条子树路径,因此遍历完之和必须进行pop操作来回溯节点。
- 对于最后一个节点的遍历,需要先进行路径记录,再终止遍历。
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)
{
//将int类型转换为string类型,并且加上->符号
string sPath;
for(int i=0; i< path.size()-1;i++)
{
//int转为string
sPath=sPath+ to_string(path[i]);
//加入->
sPath=sPath+"->";
}
//最后一个路径不需要加->,所以单独讨论
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;
//执行遍历路径函数,输入根节点,路径,返回结果
traversal(root,path,result);
//最后返回result
return result;
}
};

浙公网安备 33010602011771号