Structs
are value types that's the reason why recursion won't work. You have to use Class
instead, because they are reference types.
But as you said you want a solution with value types. Here is a solution for you using enum
Enums with indirect
cases are allocated on the heap and thus contain only pointers to the recursive children.
Without pointer indirection, the type would otherwise be infinitely large, since it contains infinitely many times.
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)
OR
You simply just use Class
You can use class for this structure, structs do not allow to reference itself.
class BinaryTree {
var value: Int
var left: BinaryTree?
var right: BinaryTree?
init(value: Int) {
self.value = value
}
}
I hope this will work for you.