精品推荐:
《征服数据结构》专栏:50多种数据结构彻底征服。
《经典图论算法》专栏:50多种经典图论算法全部掌握。
据字节跳动消息,8月6日字节跳动2025校园招聘正式启动,面向的是2025届应届毕业生(在2024年9月至2025年8月期间毕业)。
招聘岗位4000多个,涵盖研发,运营,产品,销售,设计等多种职类,其中研发类需求岗位较去年增长60%,即日起至11月30日可以在20多个城市投递。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第257题:二叉树的所有路径。
问题描述
来源:LeetCode第257题
难度:简单
给你一个二叉树的根节点 root ,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。
示例1:
输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]
示例2:
输入:root = [1]
输出:["1"]
树中节点的数目在范围 [1, 100] 内
-100 <= Node.val <= 100
问题分析
这题让返回二叉树的所有路径,可以从根节点开执行DFS,参考二叉树的前序遍历,把访问路径上的节点记录下来,到叶子节点的时候把路径保存下来即可。
JAVA:
public List<String> binaryTreePaths(TreeNode root) {
List<String> ans = new ArrayList<>();
dfs(root, "", ans);
return ans;
}
private void dfs(TreeNode root, String path, List<String> ans) {
if (root == null)
return;
// 如果是叶子节点,说明找到了一条路径,把它加入到res中
if (root.left == null && root.right == null) {
ans.add(path + root.val);
return;
}
// 如果不是叶子节点,在分别遍历它的左右子节点
dfs(root.left, path + root.val + "->", ans);
dfs(root.right, path + root.val + "->", ans);
}
C++:
public:
vector<string> binaryTreePaths(TreeNode *root) {
vector<string> ans;
dfs(root, "", ans);
return ans;
}
void dfs(TreeNode *root, string path, vector<string> &ans) {
if (root == nullptr)
return;
// 如果是叶子节点,说明找到了一条路径,把它加入到res中
if (root->left == nullptr && root->right == nullptr) {
ans.push_back(path + to_string(root->val));
return;
}
// 如果不是叶子节点,在分别遍历他的左右子节点
dfs(root->left, path + to_string(root->val) + "->", ans);
dfs(root->right, path + to_string(root->val) + "->", ans);
}
Python:
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
def dfs(tree, path):
if not tree:
return
# 如果是叶子节点,说明找到了一条路径,把它加入到res中
if not tree.left and not tree.right:
ans.append(path + str(tree.val))
return
# 如果不是叶子节点,在分别遍历他的左右子节点
dfs(tree.left, path + str(tree.val) + '->')
dfs(tree.right, path + str(tree.val) + '->')
ans = []
dfs(root, '')
return ans
笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。