swift中带结构的二叉树
我试图在swift中带结构的二叉树,swift,data-structures,tree,binary-tree,Swift,Data Structures,Tree,Binary Tree,我试图在struct的帮助下创建一个二叉树,如下所示: struct BinaryTree { var value: Int var left: BinaryTree var right: BinaryTree } 但是我得到了错误:值类型“BinaryTree”不能有递归包含它的存储属性。 这里struct是值类型,所以我不能在其中创建相同的struct对象 我怎样才能做到这一点 您可以将类用于此结构,结构不允许引用自身 class BinaryTree {
struct
的帮助下创建一个二叉树,如下所示:
struct BinaryTree {
var value: Int
var left: BinaryTree
var right: BinaryTree
}
但是我得到了错误:值类型“BinaryTree”不能有递归包含它的存储属性。
这里struct是值类型,所以我不能在其中创建相同的struct对象
我怎样才能做到这一点 您可以将类用于此结构,结构不允许引用自身
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)
class BinaryTree {
var value: Int
var left: BinaryTree?
var right: BinaryTree?
init(value: Int) {
self.value = value
}
}
此编译错误的原因是内存分配:值类型
是固定的结构,它们在内存中占据固定的空间
寄存器和堆栈,具体取决于其大小。那个空间是
由类型预先确定,并且必须在编译时已知
结构是值类型,这就是递归无法工作的原因。您必须改用Class
,因为它们是引用类型。
但正如您所说,您需要一个具有值类型的解决方案。下面是一个使用enum
带有间接
事例的枚举在堆上分配,因此只包含指向递归子级的指针。
如果没有指针间接寻址,该类型将是无限大的,因为它包含无限多次
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)
我希望这对您有用。要使用值类型构建树,您需要在混合中添加协议。以下是一个例子:
protocol Node {
var value: Int {get}
}
struct Tree: Node {
var value: Int
var left: Node
var right: Node
}
struct Leaf: Node {
var value: Int
}
Chanchal这里有几个帖子回答了这个问题:这是一个可能的重复,谢谢你的帮助:)我想让它成为值类型。@JZAU我不知道:/