这里有一个伪代码实现:https://algorithms.tutorialhorizon.com/inorder-traversal-non-recursive-approach/是我在Swift中实现的迭代顺序。
伪代码:
创建一个堆栈。将根压入堆栈并设置根= root.left继续直到它达到NULL。如果root为null并且Stack为 空然后返回,我们完成了。其他弹出堆栈顶部的节点 并将其设置为root = popped_Node。打印根目录并向右移动,root = root.right。转到第2步。结束If
但是我要重复最后一个元素。
我的订单:
func inOrderDFSIterative() -> [Int] {
var s = [self]
var curr : Node? = self
var outputArr: [Int] = []
while !s.isEmpty {
// reach the leftmost node of the current Node
while curr != nil {
s.append(curr!)
curr = curr!.left
}
curr = s.popLast()!
outputArr.append(curr!.data)
curr = curr?.right
}
return outputArr
}
这是我的二叉树类的一部分
class Node: Hashable {
static func == (lhs: Node, rhs: Node) -> Bool {
return lhs.data == rhs.data
}
var hashValue: Int {
return data
}
var data : Int
var left : Node? = nil
var right : Node? = nil
init(_ data : Int) {
self.data = data
}
func insert (_ data : Int) {
if data < self.data {
if let lft = left {
lft.insert(data)
} else {
let newNode = Node(data)
left = newNode
}
} else {
if let rgt = right {
rgt.insert(data)
} else {
let newNode = Node(data)
right = newNode
}
}
}
}
我已经建立了一棵树
let regularTree = Node(20)
regularTree.insert(8)
regularTree.insert(4)
regularTree.insert(12)
regularTree.insert(10)
regularTree.insert(14)
regularTree.insert(22)
和regularTree.inOrderDFSIterative()返回而不是[4、8、10、12、14、20、22、20],而不是[4、8、10、12、14、20、22] 这显然是不正确的。这是什么问题?
答案 0 :(得分:0)
在将s
附加到curr!.data
之前,先检查outputArr
是否为空:
curr = s.popLast()!
if !s.isEmpty {
outputArr.append(curr!.data)
curr = curr?.right
}
通常来说,避免强行展开,并使用更多的 Swifty 方式,例如可选绑定或guard
构造:
while !s.isEmpty {
// reach the leftmost node of the current Node
while let current = curr {
s.append(current)
curr = current.left
}
curr = s.popLast()
if !s.isEmpty, let current = curr {
outputArr.append(current.data)
curr = current.right
}
}