您只需要删除
tempNode
变量,并且总是使用队列的头部:
func breadthFirstSearch(_ data: Int) -> Node? {
var queue = [self]
while let head = queue.first {
queue.remove(at: 0)
if (head.data == data) {
return head
}
if let lft = head.left {
queue.append(lft)
}
if let rht = head.right {
queue.append(rht)
}
}
return nil
}
最初的实现实际上会在第一个(根)节点上迭代两次。我还从一开始就取消了不必要的重复检查。
现在,您还可以看到深度优先搜索的区别:
func depthFirstSearch(_ data: Int) -> Node? {
var stack = [self]
while let head = stack.popLast() {
if (head.data == data) {
return head
}
if let lft = head.left {
stack.append(lft)
}
if let rht = head.right {
stack.append(rht)
}
}
return nil
}