我正在做一个问题,通过递归获得整个树的和,但根节点不会与子节点相加。现在我知道根节点只是一个值,而子节点是树节点,所以没有相同的类型。
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.left
和root.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)
}