Created
June 14, 2015 15:05
-
-
Save codetalks-new/fab610c4c5ac26e7230f to your computer and use it in GitHub Desktop.
https://leetcode.com/problems/binary-tree-postorder-traversal/ Swift Solution Loop approach
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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