如何在 Swift 中分配和解包一个可选的数组对象?

How do you assign and unwrap an optional array object in Swift?

我正在尝试使用迭代方法反转 Swift 中的二叉树。本质上,我只是不断遍历每个节点,并将其放入堆栈数组中。这个数组应该是可选节点的数组。这是我的代码:

 func invertTree(_ root: TreeNode?) -> TreeNode? { 
        if root != nil {
            stack.append(root) 
        } else {
            return root
        }

        var stack = [TreeNode?]()
        while stack.count > 0 {
            if stack.last == nil {
                stack.removeLast()
            } else {

                var tempLeft : TreeNode? = stack.last!.left
                stack.last!.left = stack.last!.right
                stack.last!.right = tempLeft

                if stack.last!.left != nil {
                    stack.append(stack.last!.left)
                }

                if stack.last.right != nil {
                    stack.append(stack.last!.right)
                }
            }
        }
        return root
}

我遇到了各种可选错误。特别是,当我设置:

var tempLeft : TreeNode? = stack.last!.left

我不知道为什么它说 "value of optional type TreeNode? must be unwrapped to refer to member 'left' of unwrapped base type 'TreeNode' in solution.swift"

我不明白为什么它告诉我打开可选的,而我已经强制打开它了。我不想打开 .left 节点,因为我想在我的堆栈中包含 nils 以使迭代工作。

如有任何帮助,我们将不胜感激。

stack.last 是一个双重可选的 TreeNode:TreeNode??.

您可以像这样使用可选链接:

if stack.last == nil {
    stack.removeLast()
} else {
    stack.last
    var tempLeft : TreeNode? = stack.last!?.left
    stack.last!?.left = stack.last!?.right
    stack.last!?.right = tempLeft

    if stack.last!?.left != nil {
        stack.append(stack.last!?.left)
    }

    if stack.last??.right != nil {
        stack.append(stack.last!?.right)
    }
}

或者避免戏剧化并使用模式匹配:

if case let node?? = stack.last {
    let tempLeft = node.left
    node.left = node.right
    node.right = tempLeft

    ...

除此之外,您似乎还需要关注代码的其他方面。例如,在其声明之前使用 stack


替代实施

这是一个使用堆栈的解决方案:

class Solution {
    func invertTree(_ root: TreeNode?) -> TreeNode? {

        guard let r = root else {
            return nil
        }

        var stack = [r]

        while let node = stack.last {
            let temp   = node.left
            node.left  = node.right
            node.right = temp

            stack.removeLast()

            if let left  = node.left  { stack.append(left)  }
            if let right = node.right { stack.append(right) }
        }

        return r
    }
}