Easy
题目描述
给你一个二叉树的根节点 root,按 任意顺序,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]
示例 2:
输入:root = [1]
输出:["1"]
提示:
- 树中节点的数目在范围
[1, 100]内 -100 <= Node.val <= 100
解题思路
这是一个典型的二叉树遍历问题,需要找到从根节点到所有叶子节点的路径。
主要思路:
深度优先搜索(DFS)+ 回溯:从根节点开始,递归遍历每个节点,维护当前路径。当到达叶子节点时,将当前路径加入结果集。回溯时需要移除当前节点,保证路径的正确性。
路径表示:可以用字符串直接拼接路径,也可以用数组维护路径然后最后拼接成字符串。
具体实现步骤:
- 使用递归函数进行DFS遍历
- 维护当前路径(可以是字符串或数组)
- 当遇到叶子节点时,将路径添加到结果中
- 递归处理左右子树
- 回溯时恢复路径状态
推荐解法:使用字符串直接拼接的DFS方法,代码简洁且效率较高。时间复杂度为O(N),其中N是节点数,每个节点访问一次。
代码实现
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
if (root == nullptr) return result;
dfs(root, "", result);
return result;
}
private:
void dfs(TreeNode* node, string path, vector<string>& result) {
if (node == nullptr) return;
path += to_string(node->val);
// 叶子节点
if (node->left == nullptr && node->right == nullptr) {
result.push_back(path);
return;
}
path += "->";
dfs(node->left, path, result);
dfs(node->right, path, result);
}
};
class Solution:
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
if not root:
return []
result = []
def dfs(node, path):
if not node:
return
path += str(node.val)
# 叶子节点
if not node.left and not node.right:
result.append(path)
return
path += "->"
dfs(node.left, path)
dfs(node.right, path)
dfs(root, "")
return result
public class Solution {
public IList<string> BinaryTreePaths(TreeNode root) {
var result = new List<string>();
if (root == null) return result;
DFS(root, "", result);
return result;
}
private void DFS(TreeNode node, string path, IList<string> result) {
if (node == null) return;
path += node.val.ToString();
// 叶子节点
if (node.left == null && node.right == null) {
result.Add(path);
return;
}
path += "->";
DFS(node.left, path, result);
DFS(node.right, path, result);
}
}
var binaryTreePaths = function(root) {
if (!root) return [];
const result = [];
function dfs(node, path) {
if (!node) return;
path += node.val.toString();
// 叶子节点
if (!node.left && !node.right) {
result.push(path);
return;
}
path += "->";
dfs(node.left, path);
dfs(node.right, path);
}
dfs(root, "");
return result;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(N) | N为树中节点数,每个节点访问一次 |
| 空间复杂度 | O(N) | 递归栈的深度最坏情况下为O(N),结果存储空间也为O(N) |