我试图在struct
的帮助下制作二叉树,如下所示:
struct BinaryTree {
var value: Int
var left: BinaryTree
var right: BinaryTree
}
但我收到错误error: value type 'BinaryTree' cannot have a stored property that recursively contains it
。
这里struct是值类型,所以我不能在其中创建相同的struct对象。
我怎样才能做到这一点?
答案 0 :(得分:2)
您可以为此结构使用class,结构不允许引用自身。
class BinaryTree {
var value: Int?
var left: BinaryTree?
var right: BinaryTree?
init(value: Int) {
self.value = value
}
}
let node = BinaryTree.init(value: 1)
node.left = BinaryTree(value: 2)
此编译错误的原因是内存分配:值类型 是固定结构,它们在内存中占据一个固定的空间 寄存器和堆栈,具体取决于其大小。那个空间是 由类型预先确定,必须在编译时知道。
https://medium.com/@leandromperez/bidirectional-associations-using-value-types-in-swift-548840734047
答案 1 :(得分:1)
Structs
是价值类型,这是递归失败的原因。您必须使用Class
,因为它们是引用类型。
但正如你所说,你想要一个有价值类型的解决方案。以下是使用enum
具有indirect
个案例的枚举在堆上分配,因此只包含指向递归子节点的指针。
如果没有指针间接,那么该类型将无限大,因为它包含无限多次。
enum BinaryTree<Element: Comparable> {
case empty
indirect case node(value: Element, left: BinaryTree<Element>, right: BinaryTree<Element>)
}
extension BinaryTree {
func addNode(_ newValue: Element) -> BinaryTree<Element> {
switch self {
case .empty:
return BinaryTree.node(value: newValue, left: .empty, right: .empty)
case let .node(value, left, right):
if newValue < value {
return BinaryTree.node(value: value, left: left.addNode(newValue), right: right)
} else {
return BinaryTree.node(value: value, left: left, right: right.addNode(newValue))
}
} } }
let tree = BinaryTree<Int>.empty.addNode(2)
或强>
您只需使用Class
您可以为此结构使用class,结构不允许引用自身。
class BinaryTree {
var value: Int
var left: BinaryTree?
var right: BinaryTree?
init(value: Int) {
self.value = value
}
}
我希望这对你有用。
答案 2 :(得分:0)
要使用值类型构造树,您需要将协议添加到组合中。这是一个示例:
protocol Node {
var value: Int {get}
}
struct Tree: Node {
var value: Int
var left: Node
var right: Node
}
struct Leaf: Node {
var value: Int
}