返回

探索二叉树中的路径和:深入理解经典算法

前端

二叉树中的路径和:理解、算法和应用

什么是路径和?

想象一下一棵枝叶繁茂的树,它的树枝和树叶代表了数据。在计算机科学中,我们用二叉树这种数据结构来组织数据,其中每个结点都有最多两个子结点(左子树和右子树)。

在二叉树中,一条路径是由结点序列构成的,从根结点开始,沿着树枝延伸到一个叶结点。路径的权重是沿该路径的所有结点值的总和。路径和问题要求我们找到从根结点到叶结点的所有路径,其权重等于给定的目标值。

解决路径和问题的经典算法

解决路径和问题的经典方法之一是递归和深度优先搜索(DFS)的结合。DFS 是一种遍历二叉树的算法,它沿着一条路径深度优先地探索结点,然后再回溯到父结点并继续探索其他路径。

112. 路径总和:

给定一个二叉树和一个目标值,判断是否存在从根结点到叶结点的路径,其权重等于目标值。

public boolean hasPathSum(TreeNode root, int targetSum) {
    if (root == null) {
        return false;
    }
    if (root.left == null && root.right == null) {
        return root.val == targetSum;
    }
    return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val);
}

113. 路径总和 II:

给定一个二叉树和一个目标值,返回所有从根结点到叶结点的路径,其权重等于目标值。

public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
    List<List<Integer>> result = new ArrayList<>();
    pathSumHelper(root, targetSum, new ArrayList<>(), result);
    return result;
}

private void pathSumHelper(TreeNode root, int targetSum, List<Integer> path, List<List<Integer>> result) {
    if (root == null) {
        return;
    }
    path.add(root.val);
    if (root.left == null && root.right == null && root.val == targetSum) {
        result.add(new ArrayList<>(path));
        return;
    }
    pathSumHelper(root.left, targetSum - root.val, path, result);
    pathSumHelper(root.right, targetSum - root.val, path, result);
    path.remove(path.size() - 1);
}

437. 路径总和 III:

给定一个二叉树和一个目标值,返回二叉树中从任意结点到任意其他结点的路径数量,其权重等于目标值。

public int pathSum(TreeNode root, int targetSum) {
    if (root == null) {
        return 0;
    }
    return pathSumFromRoot(root, targetSum) + pathSum(root.left, targetSum) + pathSum(root.right, targetSum);
}

private int pathSumFromRoot(TreeNode root, int targetSum) {
    if (root == null) {
        return 0;
    }
    int count = 0;
    if (root.val == targetSum) {
        count++;
    }
    count += pathSumFromRoot(root.left, targetSum - root.val);
    count += pathSumFromRoot(root.right, targetSum - root.val);
    return count;
}

应用

路径和问题在现实生活中有着广泛的应用,包括:

  • 数据压缩
  • 数据流分析
  • 查找特定数据模式

总结

理解二叉树中的路径和对于解决各种算法问题至关重要。通过递归和深度优先搜索,我们可以有效地查找符合特定条件的路径。这些算法在数据处理、搜索和优化算法中都发挥着至关重要的作用。

常见问题解答

  • 什么是深度优先搜索?

深度优先搜索是一种遍历二叉树的算法,它沿着一条路径深度优先地探索结点,然后再回溯到父结点并继续探索其他路径。

  • 路径和问题有什么用途?

路径和问题在数据压缩、数据流分析和查找特定数据模式等应用中非常有用。

  • 112. 路径总和和 113. 路径总和 II 有什么区别?
  1. 路径总和只判断是否存在路径,而 113. 路径总和 II 返回所有符合条件的路径。
  • 437. 路径总和 III 如何考虑从任意结点到任意其他结点的路径?
  1. 路径总和 III 递归地考虑从根结点到每个结点的路径,以及从每个子树的根结点到每个结点的路径。
  • 为什么理解二叉树中的路径和很重要?

理解路径和对于解决各种算法问题至关重要,例如查找特定数据模式和优化搜索算法。