【问题标题】:Binary Tree with struct in swiftswift中带有结构的二叉树
【发布时间】:2018-03-21 05:51:08
【问题描述】:

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

我怎样才能做到这一点???

【问题讨论】:

标签: swift data-structures tree binary-tree


【解决方案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 BinaryTree {
    var value: Int
    var left: BinaryTree?
    var right: BinaryTree?
    init(value: Int) {
        self.value = value
    }
}

我希望这对你有用。

【讨论】:

  • 我想让它成为值类型。
  • @JZAU 我不知道:/
【解决方案2】:

你可以对这个结构使用类,结构不允许引用自己。

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

【讨论】:

    【解决方案3】:

    要使用值类型构造树,您需要将协议添加到组合中。这是一个例子:

    protocol Node {
      var value: Int {get}
    }
    
    struct Tree: Node {
      var value: Int
      var  left: Node
      var right: Node
    }
    
    struct Leaf: Node {
      var value: Int
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 2015-12-20
      相关资源
      最近更新 更多