二进制树与swift中的结构

时间:2018-03-21 05:51:08

标签: swift data-structures tree binary-tree

我试图在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对象。

我怎样才能做到这一点?

3 个答案:

答案 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
}