我正在尝试使用迭代方法在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以使迭代正常进行。
任何帮助将不胜感激。
答案 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
}
}