You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin报val cannot be reassigned错误时如何修改整型变量

针对你在求解LeetCode题目《根到叶子节点数字之和》时遇到的编译报错,原因和修复方案如下:

错误原因

Kotlin变量声明有明确的可变性约束:

  • val声明的是只读变量,赋值后不可重新修改,等价于Java的final修饰变量
  • var声明的是可变变量,初始化后可重复赋值
    你的代码中将累计结果的变量res声明为val,后续循环中尝试重新给res赋值,直接触发了编译报错。
修复方法

最小改动版本

仅需将res的声明关键字从val改为var即可解决编译问题,调整后的核心代码段如下:

if (root == null) {
    return 0
}

val pair: Pair<String, TreeNode> = Pair(root.`val`.toString(), root)
val queue = mutableListOf(pair)
// 原val res = 0 修改为var声明
var res = 0
while (queue.isNotEmpty()) {
    val pair = queue.removeAt(0)
    val (path, node) = pair

    if (node.left == null && node.right == null) {
        // Kotlin支持+=运算符,比res.plus()更简洁,行尾分号可省略
        res += path.toInt()
        continue
    }
    if (node.left != null) {
        val tmp = path + node.left.`val`
        queue.add(Pair(tmp, node.left))
    }
    if (node.right != null) {
        val tmp = path + node.right.`val`
        queue.add(Pair(tmp, node.right))
    }
}

return res

性能优化版本

原实现用字符串拼接路径再转整数,存在不必要的对象创建和类型转换开销,可以直接在队列中存储当前节点和累计的数字和,不需要字符串中转,代码更简洁性能也更好:

/**
 * Example:
 * var ti = TreeNode(5)
 * var v = ti.`val`
 * Definition for a binary tree node.
 * class TreeNode(var `val`: Int) {
 *     var left: TreeNode? = null
 *     var right: TreeNode? = null
 * }
 */
class Solution {
    fun sumNumbers(root: TreeNode?): Int {
        // 空节点直接返回0
        root ?: return 0
        val queue = mutableListOf(Pair(root, root.`val`))
        var total = 0
        while (queue.isNotEmpty()) {
            val (currentNode, currentSum) = queue.removeAt(0)
            // 遇到叶子节点,累计和加入结果
            if (currentNode.left == null && currentNode.right == null) {
                total += currentSum
                continue
            }
            // 左子节点非空时入队,累计值 = 上层值*10 + 当前节点值
            currentNode.left?.let {
                queue.add(Pair(it, currentSum * 10 + it.`val`))
            }
            // 右子节点非空时入队
            currentNode.right?.let {
                queue.add(Pair(it, currentSum * 10 + it.`val`))
            }
        }
        return total
    }
}

优化点说明:

  • 用?:空判断运算符简化根节点为空的边界逻辑
  • 全程用整数计算,避免字符串操作的额外开销
  • 用?.let安全调用简化子节点的非空判断,减少冗余代码
  • 移除了Kotlin中非必须的行尾分号,符合官方编码规范

内容的提问来源于stack exchange,提问作者explorer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:34:01