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

Kotlin:如何简洁实现自引用的二叉树Nil节点以避免Null

解决二叉树Node类nil节点的简洁实现问题

先说说你两种写法编译失败的原因:

  • 写法1:初始化nil时,nil本身还没完成初始化,直接把它作为参数传给Node构造函数,会触发未初始化属性引用的编译错误。
  • 写法2:私有构造函数调用主构造函数时,this指向的对象还没创建完成,不能作为参数传递,因此会报错构造函数中使用未初始化的this。

两种更简洁的实现方案:

方案1:优化原有结构(贴近你的初始需求)

这是在你现有实现基础上最简洁的写法,去掉不必要的冗余语法:

class Node {
    val left: Node
    val right: Node

    constructor(left: Node, right: Node) {
        this.left = left
        this.right = right
    }

    private constructor() {
        left = this
        right = this
    }

    companion object {
        val nil = Node()
    }
}

方案2:密封类+单例(更符合Kotlin风格)

用密封类区分普通节点和空节点,空节点做成单例object,天然满足“左右子节点指向自己”的要求,类型安全性更高:

sealed class Node {
    abstract val left: Node
    abstract val right: Node

    // 普通二叉树节点
    data class Branch(override val left: Node, override val right: Node) : Node()

    // 空节点单例
    object Nil : Node() {
        override val left: Node get() = this
        override val right: Node get() = this
    }
}

使用时,普通节点用Node.Branch(left, right)创建,空节点直接用Node.Nil即可,完全替代null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:21:03