📅  最后修改于: 2023-12-03 15:10:01.436000             🧑  作者: Mango
查找二叉树中从根节点到叶子节点的最长路径可以使用深度优先搜索(DFS)算法来实现。下面给出一个Java代码实现。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> longestPaths(TreeNode root) {
if (root == null) {
return res;
}
dfs(root, new ArrayList<Integer>());
return res;
}
private void dfs(TreeNode node, List<Integer> path) {
path.add(node.val);
if (node.left == null && node.right == null) {
if (res.isEmpty() || path.size() > res.get(0).size()) {
res.clear();
res.add(new ArrayList<Integer>(path));
} else if (path.size() == res.get(0).size()) {
res.add(new ArrayList<Integer>(path));
}
} else {
if (node.left != null) {
dfs(node.left, path);
path.remove(path.size() - 1);
}
if (node.right != null) {
dfs(node.right, path);
path.remove(path.size() - 1);
}
}
}
}
该算法的基本思路是,通过递归遍历二叉树的每个节点,记录下从根节点到当前节点的路径。当遍历到叶子节点时,将路径与已经找到的最长路径进行比较,更新最长路径。在遍历过程中,需要注意每次递归结束后将当前节点从路径中删除。
下面给出一个示例。输入为以下二叉树:
1
/ \
2 3
/ \
4 5
/ \
6 7
运行程序输出为:
[[1, 2, 4], [1, 2, 5, 6], [1, 2, 5, 7]]
其中每个列表表示从根节点到叶子节点的一条路径,列表中每个数字表示节点的值。从输出结果可以看出,最长路径为 [1, 2, 5, 6]
和 [1, 2, 5, 7]
,都有长度为 4。
该算法的时间复杂度为 $O(n)$,其中 $n$ 表示节点数目。因为每个节点只会被访问一次。空间复杂度为 $O(n)$,因为需要保存每个路径的信息。