Swift 中的 DFS 未终止
DFS in Swift not terminating
我的 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如下:
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 实现中,先删除将获取预期的父节点,而不管您是在循环结束时执行它,因为您将子节点添加到队列的末尾。在推送新节点之前,您应该将操作从堆栈中删除展开的节点。
我的 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如下:
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 实现中,先删除将获取预期的父节点,而不管您是在循环结束时执行它,因为您将子节点添加到队列的末尾。在推送新节点之前,您应该将操作从堆栈中删除展开的节点。