题目大意:给出一颗二叉树,返回所有从根节点到叶子节点的路径。
算法思想:
先序遍历该二叉树,在遍历的过程中记录下访问过的节点,如果当前节点没有孩子节点则说明产生一条遍历结果,将其放入遍历结果集中,设置回溯标记以便于寻找下一条遍历路径。如果有孩子节点则将其孩子节点压入栈中继续遍历 ,重复此过程直至遍历结束。
说明:(1).遍历过程中节点中存放的整形值,要将其转化为字符串,这里用的是sprintf() itoa()函数在这里用不了。(2)将每一条遍历路径要用"->"分隔开来。(3)辅助栈中存放的是当前节点和其父亲节点。(4)孩子节点压栈的时候应先放入右孩子节点,再放入左孩子节点。
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> res;
if(root==NULL) return res;
vector<string> tmp;
vector<TreeNode*> nodes;
stack<pair<TreeNode*,TreeNode*> > S;
bool flag=false;
pair< TreeNode*, TreeNode*> cur;
S.push(make_pair(root,( TreeNode*)NULL));
while(!S.empty()){
cur=S.top();
S.pop();
if(flag){
while(cur.second!=nodes.back()){
nodes.pop_back();
tmp.pop_back();
}
flag=false;
}
char a[25];
sprintf(a,"%d",cur.first->val);
tmp.push_back(a);
nodes.push_back(cur.first);
if(cur.first->right==NULL&&cur.first->left==NULL){
string str;
for(int i=0;i<tmp.size();++i){
str+=tmp[i];
if(i!=tmp.size()-1)
{
str+="->";
}
}
res.push_back(str);
flag=true;
}
if(cur.first->right!=NULL)
S.push(make_pair(cur.first->right,cur.first));
if(cur.first->left!=NULL)
S.push(make_pair(cur.first->left,cur.first));
}
return res;
}
};