scala - 在 Scala 中求解路径总和 II
问题描述
我是 Scala 的初学者,我正在尝试使用 Scala 解决 leetcode 上的Path Sum II,它指出:给定一个二叉树和一个总和,找到所有从根到叶的路径,其中每个路径的总和等于给定的总和。
注意:叶子是没有子节点的节点。
我想出了这个解决方案,到目前为止它只适用于具有正整数的树,但在包括负整数的树上却失败了,经过数小时的尝试,我决定寻求你的帮助。
/**
* Definition for a binary tree node.
* class TreeNode(var _value: Int) {
* var value: Int = _value
* var left: TreeNode = null
* var right: TreeNode = null
* }
*/
object Solution {
def pathSum(root: TreeNode, sum: Int): List[List[Int]] = {
if (root == null) List()
else if(root.value == sum && (root.right == null && root.left == null)) List(List(root.value))
else
pathSumhelper2(pathSumhelper(root.left, sum, root.value, root.value::Nil, Nil) :::
pathSumhelper(root.right, sum, root.value, root.value::Nil, Nil))
}
def pathSumhelper2(l1: List[List[Int]]): List[List[Int]] = l1 match {
case Nil => l1
case x :: y => x.reverse :: pathSumhelper2(y)
}
def pathSumhelper(root: TreeNode, sum: Int, accumSum: Int, currentList: List[Int], result: List[List[Int]]): List[List[Int]] = {
if (root==null) result
else if (accumSum+root.value==sum) (root.right,root.left) match {
case(null,null) => root.value :: currentList match { case x => x :: result}
case(_,_) => result
}
else {
root.value :: currentList match {
case x => (pathSumhelper(root.left, sum, root.value + accumSum, x, result) :::
pathSumhelper(root.right, sum, root.value + accumSum, x, result)).distinct
}
}
}
}
我知道使用负数可以获得总和而不是在根节点,但是我不确定如何添加此检查,可能是由于我的实现。如果有人能告诉我如何添加这个约束或对我的方法有任何评论,我将不胜感激。
解决方案
我解决这个问题已经有几年了。回顾旧代码,它的想法似乎是每次递归都减去value
,sum
这样当我们到达叶节点时,我们只需测试sum == value
.
def pathSum(root:TreeNode, sum:Int, path:List[Int]=List()):List[List[Int]] = {
if (root == null) List()
else if (root.left == null && root.right == null)
if (sum == root.value) List((root.value :: path).reverse)
else List[List[Int]]()
else
Option(root.left).fold(List[List[Int]]()) {tn =>
pathSum(tn, sum-root.value, root.value::path)} :::
Option(root.right).fold(List[List[Int]]()) {tn =>
pathSum(tn, sum-root.value, root.value::path)}
}
推荐阅读
- maven - Spring Boot Maven 插件 - “附加”设置有什么作用?
- javascript - 如何让乐队在 Chart.js 中实现乐队扩展?
- sql - 将两个选择查询的结果合并到一张表中
- angular - 单元测试 Angular 表单和 subFormGroup
- vue.js - 每次路由更改时重复键 Vuex Getters
- sql - Impala:计数(不同)具有多个 where 语句标准?
- r - 无法在 Ubuntu 18.04 linux 上安装最新的 R 版本
- windows - 共享代码文件夹的Git设置问题,保持工作流速度(Win10)
- react-native - 在 react-native 中刷新数据
- python - 导入的 .CSV 的第一列不能被其标签引用