我有一个Node
类的二叉树,如下所示:
class Node<T: Equatable> {
let value: T
let left: Node<T>?
let right: Node<T>?
init(value: T, left: Node<T>? = nil, right: Node<T>? = nil) {
self.value = value
self.left = left
self.right = right
}
}
值必须相等。
我可以像这样测试公平性:
let a = Node(value: 8)
let b = Node(value: 7)
let c = a.value > b.value
哪种方法正常,c: true
但是当我编写一个使用节点公平性的泛型函数时,我得到了错误:
func isBinaryTree<T>(node: Node<T>) -> Bool {
if let leftNode = node.left {
guard leftNode.value < node.value else {
return false
}
guard isBinaryTree(node: leftNode) else {
return false
}
}
if let rightNode = node.right {
guard rightNode.value >= node.value else {
return false
}
guard isBinaryTree(node: rightNode) else {
return false
}
}
return true
}
let result = isBinaryTree(node: root)
错误:
error: binary operator '<' cannot be applied to two 'T' operands guard leftNode.value < node.value ||`
我不确定为什么编译器似乎不知道为什么T
值为Equatable
或为什么它不认为T
leftNode
}}与T
上的node
类型相同。
代码:
let d = Node(value: Float(3), left: Node(value: Int(8)) , right: nil)
按预期给出错误。
进一步研究这个问题,它与函数无关,因为当我尝试代码时:
let x = Node(value: 3, left: Node(value: 8) , right: nil)
let y = x.value < x.left!.value
我得到了同样的错误
答案 0 :(得分:2)
在一般情况下,两个User
个对象不具有可比性。这取决于他们发现的树的种类。例如,如果节点仅被约束为二叉树的有效成员,那将是有意义的,但事实并非如此。
幸运的是,您不需要Node
成为Node
,您只需要Comparable
value
:
Comparable
答案 1 :(得分:0)
感谢亚历山大,我让Equatable
和Comparable
混淆了!节点应该是
class Node<T: Comparable> {
//...
}
代码:
let a = Node(value: 8)
let b = Node(value: 7)
let c = a.value > b.value
必须正常工作,因为编译器知道值为Int
s。但是在函数中,输入值是未知的。