Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save codetalks-new/fab610c4c5ac26e7230f to your computer and use it in GitHub Desktop.
Save codetalks-new/fab610c4c5ac26e7230f to your computer and use it in GitHub Desktop.
func postorderTraversal(root:TreeNode) -> [Int]{
var arr = [Int]()
var nodes = [TreeNode]()
var middleNodes = [TreeNode]()
var current :TreeNode? = root
var lastMiddleNode : TreeNode?
while current != nil{
let cur = current!
if cur.left == nil && cur.right == nil{
// 没有子节点,访问此节点
arr.append(cur.val)
if cur === root{
// 已经是根节点了
break
}
// 往回走
current = nodes.removeLast()
lastMiddleNode = middleNodes.last
while current === lastMiddleNode{
arr.append(current!.val)
middleNodes.removeLast() //补之前的一次删除
if nodes.isEmpty{
current = nil
break
}
current = nodes.removeLast()
lastMiddleNode = middleNodes.last
}
}else{
//左边或者右边还有节点.先把中间的节点保存下来.以备后用
nodes.append(current!)
middleNodes.append(current!)
if let left = current?.left{
// 准备继续向左走,把当前节点右子节点保存下来
if let right = current?.right{
nodes.append(right)
}
// 向左走
current = left
}else{
// 向右走 这种情况下左右必须有.因为else中必须一个有节点
current = current?.right
}
}
}
return arr
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment