【代码随想录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转为stringsPath=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);//最后返回resultreturn result;}
};