swift - Swift 中的 DFS 没有终止
问题描述
我的 BFS 实现工作正常:
func bfsReturnVals() -> [Int] {
// bfs uses a queue.
var queue = [Node]()
var queueVals = [Int]()
queue.append(self)
while let head = queue.first {
if let lft = head.left {
queue.append(lft)
}
if let rgt = head.right {
queue.append(rgt)
}
queueVals.append(queue[0].data)
queue.removeFirst()
}
return queueVals
}
但我通常会递归地编写 DFS。现在我对 DFS 的类似实现不会终止
func dfsReturnVals() -> [Int] {
var stack = [Node]()
var queueVals = [Int]()
stack.append(self)
while let tail = stack.last {
if let lft = tail.left {
stack.append(lft)
}
if let rgt = tail.right {
stack.append(rgt)
}
queueVals.append(stack[stack.count - 1].data)
stack.removeLast()
}
return queueVals
}
我不知道为什么。removeLast() 不应该像 removeFirst() 一样工作吗?
我的节点类如下:
class Node : CustomStringConvertible {
var description : String {return "\(self.data)" }
var data : Int
var left: Node?
var right: Node?
init(_ data: Int) {
self.data = data
}
func insert(_ data: Int) {
if data < self.data {
if let lft = self.left {
lft.insert(data)
} else {
let newNode = Node(data)
left = newNode
}
} else {
if let rgt = self.right {
rgt.insert(data)
} else {
let newNode = Node(data)
right = newNode
}
}
}
}
解决方案
当您从堆栈中移除最后一个项目时,您将移除刚刚推入的项目。在您的 bfs 实现中,无论您在循环结束时执行此操作,先删除都会获取预期的父节点,因为您将子节点添加到队列的末尾。在推送新节点之前,您应该将操作从堆栈中删除扩展节点。
推荐阅读
- postgresql - SELECT COUNT 在 Postgres 中花费的时间太长
- angular - 通过 post 请求将 pdf 文件发送到服务器
- fortran - 现代 Fortran 等效于嵌套 DO 和 GO TO 共享的操作语句
- c# - 私有类成员是否应该使用自己的 ILogger 实例?
- reactjs - react-final-form 字段的获取请求 onChange 事件正在清除 autoComplete 字段
- json - 如何在 Flutter 中集成 MikroTik API?
- python - 在模型中编写查询
- java - 如何解决 dio https 状态 401 错误?
- python - 从第一个键中删除最后一个值
- strapi - “找不到模型用户权限。”