目前脑子里还有很多问题,就比如遇到问题如何选择"前中后序遍历"?????理论依据是什么?
这个题有点意思
看着个题的时候,需要了解到,递归中隐藏着回溯,具体可参考代码回想录.
其实只要把遍历这个东西理解透彻就好办,主要还是卡在了路径的储存格式:
需要利用两个vector来储存,例:vector<int> path,vector<string> res,
既用path储存每个节点的值, 然后将path转化为string 用res这个vector<string>来储存;
class Solution {
public:
void traversal(TreeNode* cur,vector<int>& path,vector<string>& res){
path.push_back(cur->val);
/*----------------------判断是否为"叶子"并进行处理----------------------------------*/
if(cur->left==nullptr && cur->right==nullptr){
//如果是“叶子”节点说明可以将path里的数据输出成字符串并加到res里了;
string pathstr;
//先搞定第n-1个,因为最后一个字符串里没有"->"
for(int i=0;i<path.size()-1;i++)
{
pathstr+=to_string(path[i]);
pathstr+="->";
}
pathstr+=to_string(path[path.size()-1]);
res.push_back(pathstr);
return ;
}
/*-----------------------------------------------------------------------------------*/
if(cur->left){
traversal(cur->left,path,res);
path.pop_back();//要注意何时进行pop操作,这也是回溯的过程
// res.pop_back();//在这里跌过坑,注意这里pop的是path不是res,之前没理解这里
}
if(cur->right){
traversal(cur->right,path,res);
//res.pop_back();
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;
}
};