使用递归获取树的总和,但根节点不会添加 Kotlin



我正在做一个问题,通过递归获得整个树的和,但根节点不会与子节点相加。现在我知道根节点只是一个值,而子节点是树节点,所以没有相同的类型。

class TreeNode<T>(var key: T){
var left: TreeNode<T>? = null
var right: TreeNode<T>? = null
}

fun treeSumR(root: TreeNode<Int>): Int{
if (root == null) return 0
return root.key + root.left?.let { treeSumR(it) } + root.right?.let { treeSumR(it) }
}

fun buildTree2(): TreeNode<Int>{
val one = TreeNode(1)
val two = TreeNode(2)
val four = TreeNode(4)
val eleven = TreeNode(11)
val three = TreeNode(3)
val four2 = TreeNode(4)
three.left = eleven
three.right = four
eleven.left = four2
eleven.right = two
four.right = one
return three
}

感谢您的帮助。谢谢

由于将不可为Null的Int(root.key(和可为NullInt?s(子树的和(一起添加,+运算符出现错误。子树的和是可以为null的,因为您编写了?.。其效果是,如果root.left为null,则root.left?.let { ... }的整个表达式求值为null。

当表达式为null时,可以使用elvis运算符为其提供默认值:

return root.key +
(root.left?.let { treeSumR(it) } ?: 0) +
(root.right?.let { treeSumR(it) } ?: 0)

但是,由于您已经在检查root是否为null并返回0,因此更好的方法是使root实际上为null,并将root.leftroot.right直接传递到treeSumR:

//               notice the question mark here
//                              v
fun treeSumR(root: TreeNode<Int>?): Int{
if (root == null) return 0
return root.key +
treeSumR(root.left) + // since treeSumR now takes a nullable node, you can directly pass the subtrees in
treeSumR(root.right)
}

最新更新