Swift错误答案中的迭代有序遍历

时间:2018-12-24 13:42:58

标签: swift

这里有一个伪代码实现: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] 这显然是不正确的。这是什么问题?

1 个答案:

答案 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
    }
}