// 基于 class 实现二叉树
// LJJ 2024.12.10
open class NodeA {
    public NodeA(protected var value: String,
        protected let left!: ?NodeA = None,
        protected let right!: ?NodeA = None) {}

    public open func traverse(): Unit {
        left?.traverse()
        print(value)
        right?.traverse()
    }
}

class NodeB <: NodeA {
    public init(value: String,
        left!: ?NodeA = None, right!: ?NodeA = None) {
        super(value, left: left, right: right)
    }

    public func traverse(): Unit {
        print(value)
        left?.traverse()
        right?.traverse()
    }
}

main() {
    var tree = NodeA('A',
        left: NodeA('B', left: NodeA('C', right: NodeA('D'))),
        right: NodeB('E', left: NodeB('F'), right: NodeB('G')))
    tree.traverse()
}