Given a binary tree, return all root-to-leaf paths.
For example, given the following binary tree:
1
/ \
2 3
\
5
All root-to-leaf paths are:
[“1->2->5”, “1->3”]
s思路:
1. 树。遍历。这道题,dfs最容易,而且是用pre-order.
2. 先来recursive:比较好实现。
3. 再来iterative.难点是要把得到的string后面的数删除好得到新的path
//方法1:dfs,pre-order
class Solution {
public:
void dfs(TreeNode* root,vector<string>&res,string cur){
//
if(!root) return;
string tmp=to_string(root->val);
if(!root->left&&!root->right){
cur.append(tmp);
res.push_back(cur);
return;
}
dfs(root->left,res,cur+tmp+"->");
dfs(root->right,res,cur+tmp+"->");
}
vector<string> binaryTreePaths(TreeNode* root) {
//
vector<string> res;
dfs(root,res,"");
return res;
}
};
//方法2:iterative,pre-order,比较慢就是了!
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
//
vector<string> res;
if(!root) return res;
string cur;
stack<TreeNode*> ss;
TreeNode* pnow=root,*pre=NULL;
cur+=to_string(pnow->val);
while(pnow||!ss.empty()){
while(pnow){
ss.push(pnow);
pnow=pnow->left;
if(pnow)
cur+=("->"+to_string(pnow->val));
}
pnow=ss.top();
if(!pnow->left&&!pnow->right){
res.push_back(cur);
}
if(pnow->right&&pnow->right!=pre){
pnow=pnow->right;
cur+=("->"+to_string(pnow->val));
}else{
while(cur.size()>2&&cur.substr(cur.size()-2)!="->")//bug:加保护
cur.pop_back();
if(cur.size()>=2){//bug:加保护!
cur.pop_back();
cur.pop_back();
}
ss.pop();
pre=pnow;
pnow=NULL;
}
}
return res;
}
};