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
相关产品推荐
相关产品推荐

