跳至主要內容

一个和的路径数


一个和的路径数

题目

给定一棵二叉树和一个数字S,找出树中的所有路径,使每条路径的所有节点值的和等于S。请注意,路径可以在任何节点开始或结束,但所有路径必须遵循从父到子(从上到下)的方向。

解答

import java.util.*;

class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;

  TreeNode(int x) {
    val = x;
  }
};

class CountAllPathSum {
  public static int countPaths(TreeNode root, int S) {
    List<Integer> currentPath = new LinkedList<>();
    return countPathsRecursive(root, S, currentPath);
  }

  private static int countPathsRecursive(TreeNode currentNode, int S, List<Integer> currentPath) {
    if (currentNode == null)
      return 0;

    // 添加当前节点到路径中
    currentPath.add(currentNode.val);
    int pathCount = 0, pathSum = 0;
    // 在当前路径列表中找到所有子路径的和
    ListIterator<Integer> pathIterator = currentPath.listIterator(currentPath.size());
    while (pathIterator.hasPrevious()) {
      pathSum += pathIterator.previous();
      // 如果任何子路径和S相等,便增加路径数
      if (pathSum == S) {
        pathCount++;
      }
    }

    // 遍历左子树
    pathCount += countPathsRecursive(currentNode.left, S, currentPath);
    // 遍历右子树
    pathCount += countPathsRecursive(currentNode.right, S, currentPath);

    // 从要回溯的路径中删除当前节点 
    // 当我们向上递归调用堆栈时,我们需要删除当前节点。
    currentPath.remove(currentPath.size() - 1);

    return pathCount;
  }

  public static void main(String[] args) {
    TreeNode root = new TreeNode(12);
    root.left = new TreeNode(7);
    root.right = new TreeNode(1);
    root.left.left = new TreeNode(4);
    root.right.left = new TreeNode(10);
    root.right.right = new TreeNode(5);
    System.out.println("Tree has path: " + CountAllPathSum.countPaths(root, 11));
  }
}
上次编辑于:
贡献者: Neil