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

时间:2019-09-16 14:38:12

标签: swift binary-tree optional

我正在尝试使用迭代方法在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

我不确定为什么为什么说“必须将可选类型TreeNode的值解包以引用solution.swift中已解包基本类型'TreeNode'的成员'left'”

我不明白为什么当我已经强制展开可选内容时,它告诉我取消可选内容。我不想解包.left节点,因为我想在堆栈中包含nil以使迭代正常进行。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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