Я новичок в Scala и пытаюсь найти Path Sum II на leetcode с Scala, который гласит: По заданному двоичному дереву и сумме найти все root пути к листу, где сумма каждого пути равна заданной сумме.
Примечание: лист - это узел без дочерних элементов.
Я придумал это решение, которое до сих пор работало для деревьев. только с положительными целыми числами, но не работает на деревьях, включая отрицательные целые числа, и после нескольких часов попыток я решил обратиться к вам за помощью.
/**
* 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
}
}
}
}
Я понимаю, что с отрицательными числами можно получить сумму и не быть на узле root, однако я не уверен, как добавить эту проверку, возможно, из-за моей реализации. Буду признателен, если кто-нибудь сможет объяснить мне, как добавить это ограничение или какие-либо комментарии о моем подходе.