我正在做一個問題以通過遞回獲得整個樹的總和,但根節點不會與子節點相加。現在我知道根節點只是一個值,而子節點是樹節點,所以型別不同。
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
}
任何幫助表示贊賞。謝謝。
uj5u.com熱心網友回復:
運算子存在錯誤, 因為您將不可為空的Int( root.key) 和可空 Int?的 s(子樹的總和)相加。子樹的總和可以為空,因為您撰寫了?.. 其效果是,如果為 null,則整個運算式的root.left?.let { ... }計算結果為root.leftnull。
當運算式為空時,您可以使用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)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505884.html
上一篇:使用二進制數列確定哪些框被填充
