文章目录
1. 路径相关的题目
112.路径总和
题目:判断是否存在从根节点到某一叶子节点的路径,路径上所有节点值之和为给定值
思路:利用深度优先算法
public boolean hasPathSum(TreeNode root, int sum) {
// 对题目的输入进行判断,若空则返回
return root != null && hasPathSum1(root, sum);
}
/*
* 两种情况:
* ① 当前节点为叶子节点,且符合要求
* ② 当前节点为内部节点,判断其孩子节点中是否有符合要求的题目
* */
private static boolean hasPathSum1(TreeNode root, int sum) {
return (root.val == sum && root.left == null && root.right == null)
|| (root.left != null && hasPathSum1(root.left, sum - root.val))
|| (root.right != null && hasPathSum1(root.right, sum - root.val));
}
// 下面有另一种书写方式:
public boolean hasPathSum(TreeNode root, int sum) {
// 是否为空
if (root == null) return false;
// 叶子节点是否为空
if (root.left == null && root.right == null && sum - root.val == 0) return true;
// 判断左右节点中是否有满足的情况
return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
}
复杂度:
- 时间复杂度:O(n),为最糟糕的情况,即遍历了所有节点,但没有一个路径符合
- 空间复杂度:O(log(n)),为树的高度,最多有几个节点被压入栈中
113.路径总和 II
题目:类似于上一道题,但这里要求是输出所有符合要求的路径
思路:依旧是深度优先遍历,但要遍历完所有路径,相同的思路两种代码的写法:
// 写法一:
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> lists = new ArrayList<>();
if (root == null) return lists;
pathSum(root, sum, lists, new ArrayList<>());
return lists;
}
private void pathSum(TreeNode root, int sum, List<List<Integer>> lists, List<Integer> list){
if (root == null) {
return;
}
list.add(root.val);
// 判断为从 root-to-leaves 的串,则判断是否符合题意
if (root.val == sum && root.left == null && root.right == null) {
lists.add(new ArrayList<>(list));
} else {
// 当前节点为中间节点,则继续往下查看其左右节点
pathSum(root.left, sum - root.val, lists, list);
pathSum(root.right, sum - root.val, lists, list);
}
// 完成这个节点的遍历返回父节点时,要删除当前节点的值
list.remove(list.size() - 1);
}
// 写法二:
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> lists = new ArrayList<><