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我不知道:/