题目:https://leetcode-cn.com/problems/binary-tree-paths/
思路一:递归
分析; 在这道题目中涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一一个路径在进入另一个路径。用前序遍历,将根节点入数组,直到遇到叶子节点,这样一条路径被保存在了数组;然后将这条路径的节点转换成字符串,并保存进一个字符串数组,回溯一个路径,进入另外一条路径。
前序遍历的过程:
步骤:递归
1、函数参数和返回值
函数的参数输入的是节点,数组(path存储每一条路径的节点),数组(字符串数组,存储结果);返回值为字符串数组
2、终止条件
如果结点的左右子树是空节点,则定义一个字符串,(path里面存储的是条路经的节点),将path里面的每个整型数字转换成字符串,将字符串入数组
3、如果左子树存在,则递归,path抛出一个元素,实现回溯
4、如果右子树存在,则递归 ,path抛出一个元素,实现回溯
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result)
{
path.push_back(cur->val);
//终止的条件
if(cur->left==NULL&&cur->right==NULL)
{
string spath;
for(int i=0;i<path.size()-1;i++)
{
spath+=to_string(path[i]);
spath+="->";
}
spath+=to_string(path[path.size()-1]);
result.push_back(spath);
spath.clear();
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;
if(root==NULL)
return result;
traversal(root,path,result);
return result;
}
思路二:迭代法
广度优先遍历,定义两个队列,一个用于存储节点,一个用于存储路径;将根节点入队列,,一开始只有根节点,将队列队首元素弹出,如果他是叶子节点,则将他加入到对应的路径当中,如果它不是叶子节点,则将他的所有孩子节点加入到队列的尾部,当队列为空时,广度优先搜索结束。
步骤:
1、定义一个字符串数组,用于保存结果,定义两个队列,一个用于保存节点,一个用于保存每条路径。
2、如果节点是那个空,就返回。如果不为空。就将根节点入两个队列(一个队列存储节点,一个存储路径)
3、将节点抛出,路径抛出,(节点和它所在的路径在两个队列中存储的位置相同)
4、 如果节点的左右子树不存在,将路径加入到结果数组里面
5、 如果左子树存在,则节点的左子树入队列,然后将“-》”+节点数值加入到路径队列中,右子树存在,操作相同;
6、循环结束后,将结果数组抛出
vector<string> binaryTreePaths(TreeNode* root)
{
vector<string>vec;
queue<TreeNode*>node_que;
queue<string>result_que;
if(root==NULL)
return vec;
node_que.push(root);
result_que.push(to_string(root->val));
while(!node_que.empty())
{
TreeNode*node=node_que.front();
string paths=result_que.front();
node_que.pop();
result_que.pop();
if(node->left==NULL&&node->right==NULL)
{
vec.push_back(paths);
}
else
{
if(node->left)
{
node_que.push(node->left);
result_que.push(paths+"->"+to_string(node->left->val));
}
if(node->right)
{
node_que.push(node->right);
result_que.push(paths+"->"+to_string(node->right->val));
}
}
}
return vec;
}