又是老台词:欢迎大家来到一晚一度的leetcode刷题时间。首先,博主也自我检讨一下,由于昨晚和宿友出去喝酒了,导致昨晚停更了每晚必备的leetcode刷题日记。在此博主表示深深抱歉。因此博主今天决定来分享一下和递归算法地位相同的一种算法——回溯算法。回溯法解决问题我记得在前面一期文章中曾用来解决八皇后问题。感兴趣的同学可以去看看博主曾经分享的文章。回溯法其实本质就是深度优先搜索(这后面会见到)。回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。因此这部分内容常常和图和树的知识结合,也是一大难点。刚好今天博主分享了二叉树的基础内容,所以今天的这道题目也就自然和二叉树有关啦,是一道用深度优先搜索来解决二叉树的问题。好啦,废话不多说,下面直接上题目吧:

解题思路:
最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。
解题代码(c++版):
class Solution {
public:
void construct_paths(TreeNode* root, string path, vector<string>& paths)//注意这里path是字符串类型的容器
{
if (root != nullptr)
{
path += to_string(root->val);
if (root->left == nullptr && root->right == nullptr) { // 当前节点是叶子节点
paths.push_back(path); // 把路径加入到答案中
}
else {
path += "->"; // 当前节点不是叶子节点,继续递归遍历
construct_paths(root->left, path, paths);//先左子树
construct_paths(root->right, path, paths);//再右子树
}
}
}
vector<string> binaryTreePaths(TreeNode* root)
{
vector<string> paths;
construct_paths(root, "", paths);
return paths;
}
};
好啦,今天的分享就到此结束啦,早点睡觉,少熬夜。
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.
本文介绍了如何使用深度优先搜索和回溯法解决二叉树路径问题。博主通过分享解题思路和C++代码,详细解析了如何找到从根节点到叶子节点的所有路径。此外,还探讨了回溯法与递归的关系,以及它在解决八皇后问题中的应用。
329

被折叠的 条评论
为什么被折叠?



