算法-二叉树:二叉树的所有路径
给出一个二叉树,返回所有从根节点到叶子节点的路径。
思路解析:需要从父节点指向子节点,显然使用前序遍历比较方便。
//方法一:递归
void allPath(TreeNode* root,vector<int>& path, vector<string>& str){
//中
path.push_back(root->val);
if(root->left==NULL && root->right==NULL){ //叶子节点
string s;
for(int i = 0; i < path.size()-1; i++){
s = s+to_string(path[i])+"->";
}
s = s+to_string(path[path.size()-1]);
str.push_back(s);
}
//左
if(root->left){
allPath(root->left,path,str);
path.pop_back();//回溯!!!不要忘记,不然下面right路径要出错
}
//右
if(root->right){
allPath(root->right,path,str);
path.pop_back();//回溯!!!不要忘记
}
}
//方法二:迭代
void allPath(TreeNode* root,vector<int>& path, vector<string>& str){
stack<TreeNode*> st;
stack<string> sPath;//保存遍历路径的节点
if(root == NULL) return;
st.push(root);
sPath.push(to_string(root->val));
while(!st.empty()){
//中
TreeNode* node = st.top();
st.pop();
path.push_back(node->val);
string s = sPath.top();
sPath.pop();
if(!node->left && !node->right) { //叶子节点
str.push_back(s);
}
//右
if(node->right){
st.push(node->right);
sPath.push(s + "->" + to_string(node->right->val));
}
//左
if(node->left){
st.push(node->left);
sPath.push(s + "->" + to_string(node->left->val));
}
}
}