我正在编写一个函数,该函数返回树的下一个节点将来自任何节点,如果进行有序遍历。该函数具有可选的返回,如果没有下一个节点(即我们在最后一个节点处),则需要该返回。我从函数返回一个可选的和非可选的,并且在两个地方都存在编译器错误。这是代码:
class TreeNode<T>
{
var leftChild : TreeNode?
var rightChild : TreeNode?
var parent : TreeNode?
var value : T
init(withValue:T) {
self.value = withValue
}
func nextInOrderNode<T>() -> TreeNode<T>?
{
if var nextNode = rightChild
{
while nextNode.leftChild != nil {
nextNode = nextNode.leftChild!
}
return nextNode //error 1
}
else
{
var nextNode = parent
var currentNode = self
while nextNode?.rightChild !== currentNode {
currentNode = nextNode!
nextNode = nextNode?.parent
}
return nextNode //error 2
}
}
}
错误是:
error 1: Cannot convert return expression of type 'TreeNode<T>' to return type 'TreeNode<T>?'
error 2: Cannot convert return expression of type 'TreeNode<T>?' to return type 'TreeNode<T>?'
我不确定我在这里做错了什么,因为从我所看到的情况来看,这似乎应该有效。任何帮助将不胜感激。
答案 0 :(得分:1)
该问题与可选与非可选返回值无关。 在
func nextInOrderNode<T>() -> TreeNode<T>?
您在本地方法中引入 new 占位符类型T
,
与占位符类型T
无关(并隐藏)
在class TreeNode<T>
。
解决方案很简单: 只需删除方法声明中的占位符:
func nextInOrderNode() -> TreeNode<T>?
您在此处不需要它,因为T
中class TreeNode<T>
的范围
是整个类定义,包括所有方法。